过了六个点 剩下的re了 求助
查看原帖
过了六个点 剩下的re了 求助
386737
Mei_Misaki楼主2021/11/13 18:04
#include<iostream>  
#include<cstring>
using namespace std ; 
int c,n,m,en; 
int cow[5005],vis[8005],q[100000],dis[8005],l[8005]; 
int tail,head;  
int ans=1e9,sum;
struct edge{
	int f,t,w,n;
}a[1500];  
void spfa(int s){
	tail=head=1; 
	q[1]=s; 
	vis[s]=1; 
	dis[s]=0; 
	while(head<=tail){   
		int xe=l[q[head]];  
		if(xe==0){
			head++; 
			continue;
		}
		while(xe!=0){   
			if(dis[a[xe].f]+a[xe].w<dis[a[xe].t]){
				dis[a[xe].t]=dis[a[xe].f]+a[xe].w;
				if(vis[a[xe].t]==0){
					vis[a[xe].t]=1; 
					tail++; 
					q[tail]=a[xe].t;
				}
			} 
			xe=a[xe].n;
		}
		vis[q[head]]=0; 
		head++;
	}
}
void add(int f,int t,int w){ 
	en++; 
	a[en].f=f; 
	a[en].t=t; 
	a[en].w=w; 
	a[en].n=l[a[en].f]; 
	l[a[en].f]=en;
}
int main(){
	cin>>c>>n>>m; 
	for(int i=1;i<=c;i++) 
		cin>>cow[i];
	for(int i=1;i<=m;i++){
		int f,t,w; 
		cin>>f>>t>>w; 
		add(f,t,w); 
		add(t,f,w);
	}
	for(int i=1;i<=n;i++){
		for(int i=1;i<=n;i++){
			dis[i]=1e9; 
			vis[i]=0;
		}
		spfa(i); 
		sum=0; 
		for(int j=1;j<=c;j++) sum+=dis[cow[j]]; 
		ans=min(ans,sum); 
//		cout<<ans<<','<<i<<endl;
	} 
	cout<<ans<<endl;
	return 0;
}
2021/11/13 18:04
加载中...