spfa A一个点。。。
查看原帖
spfa A一个点。。。
372603
frank520楼主2021/1/9 09:08

感觉我的算法思维没啥问题啊

各位大佬帮忙看看

#include<bits/stdc++.h>
#define N 505
#define PP 805
#define C 1455
using namespace std;
int n,p,c,cow[N],ans=0x3f,cnt=0;
int dis[N][PP];//mn[i][j]表示第i头牛到第j个农场的最小值 
struct P{
	int to,w,next;
}pi[C];
int head[PP],tot=0;
bool vis[PP];
void add(int x,int y,int z){
	++tot;
	pi[tot].to=y;
	pi[tot].w=z;
	pi[tot].next=head[x];
	head[x]=tot;
}
queue<int > q;
void ot(){
	while(q.size())
	 	q.pop();
}
void spfa(int num){
	int s=cow[num];
	memset(vis,0,sizeof(vis));
	ot();//清空队列 
	dis[num][s]=0;
	vis[s]=0;
	q.push(s);
	while(q.size()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=head[x];i;i=pi[i].next){
			int y=pi[i].to,z=pi[i].w;
			if(dis[num][y]>dis[num][x]+z){
				dis[num][y]=dis[num][x]+z;
				if(!vis[y]){
					q.push(y);
					vis[y]=1;
				}
			}
		}
	}
}
int main(){
	memset(dis,0x3f,sizeof(dis));
	int u,v,w;
	scanf("%d%d%d",&n,&p,&c);
	for(int i=1;i<=n;i++)
		scanf("%d",&cow[i]);
	for(int i=1;i<=c;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	for(int i=1;i<=n;i++)//枚举每一头牛 
		spfa(i);
	for(int i=1;i<=p;i++){//以每一个农场作为终点
		cnt=0;
		for(int j=1;j<=n;j++){//枚举每一头牛 
			cnt+=dis[j][i];
		} 
		ans=min(ans,cnt);
	}
	printf("%d",ans);
	return 0;
}
2021/1/9 09:08
加载中...