20个数据对1个给的两个例子也是对的,求大佬看看哪儿有问题
  • 板块P2683 小岛
  • 楼主A_xu
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/10 19:30
  • 上次更新2023/10/23 22:01:07
查看原帖
20个数据对1个给的两个例子也是对的,求大佬看看哪儿有问题
946604
A_xu楼主2023/3/10 19:30
#include <bits/stdc++.h>
using namespace std;
long long N,M;
long long islr[102][102];//表示岛之间的无向图
struct  act{	
	long long j;//判断是1还是0
	long long s;
	long long t;
	long long u;
	long long v;	
	long long e;	
};
act action[5002];
void xiu(long long i){	
	for(long long k = 1 ; k<=N ;k++){
		for(long long p = 1 ;p <=N ;p++){	
			for(long long q=1; q<=N ;q++){		
				if(islr[p][q]>islr[p][k]+islr[k][q]){			
					islr[p][q]=islr[p][k]+islr[k][q];
					islr[q][p]=islr[p][k]+islr[k][q];		
				}		
			}	
		}
	}
}


void dij(long long i){
	
	for(long long k = 1 ; k<=N ;k++){
		
		for(long long p = 1 ;p <=N ;p++){
			
			for(long long q=1; q<=N ;q++){
				
				if(islr[p][q]>islr[p][k]+islr[k][q]){
					
					islr[p][q]=islr[p][k]+islr[k][q];
					islr[q][p]=islr[p][k]+islr[k][q];	
					
				}
				
			}
			
		}
	}
	
	
	long long  minn =999999;
		
		if(minn>islr[action[i].s][action[i].t]){
			
			minn=islr[action[i].s][action[i].t];
			
			cout<<minn<<endl;
			
		}

	if(minn >= 999999){
		
		cout<<-1<<endl;	
		
	}
	
}

int main(){
	
	cin>>N>>M;
	
	for(long long i = 1; i<=M ;i++){
		
		act store;
		
		long long a,b,c,d,f,g;
		
		cin>>a;
		
		if(a==0){
			
			store.j=a;
			
			cin>>b;
			
			cin>>c;
			
			store.s=b;
			
			store.t=c;
			
		}else{
			
			store.j=a;
			
			cin>>d>>f>>g;
			
			store.u=d;
			
			store.v=f;
			
			store.e=g;
			
		}
		
		action[i]=store;
		
	}//以上均为输入
	
	for(long long i = 1;i<=N;i++){
		
		for(long long j = 1 ;j<=N;j++){
			
			if(i!=j){
				
			islr[i][j]=999999;	
			
			}			
			
		}
		
	}
	
	for(long long i = 1;i<=M ;i++){
		
		if (action[i].j==1){
			
			islr[action[i].u][action[i].v]=action[i].e;
			
			islr[action[i].v][action[i].u]=action[i].e;
			
			xiu(i);			
		}else{		
			dij(i);	
		}
		
	}
	 	
} 
2023/3/10 19:30
加载中...