求助SPFA 0分
查看原帖
求助SPFA 0分
409774
Maysoul楼主2023/5/5 15:20
//2023/5/5
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
const int INF=0x3f3f3f3f;
int num=INF,ans,m,s,t;
int head[11000];
int escnt;
struct linkstar{
	int to,from;
	int w;
	int next;
}edge[11000];
void add(int from,int to,int w)
{
	edge[++escnt].from=from;
	edge[escnt].to=to;
	edge[escnt].w=w;
	edge[escnt].next=head[from];
	head[from]=escnt;
}
int dis[11000];
bool vis[11000];
int cnt[11000];
queue<int> que;
int n;
void SPFA(int sid)
{
	for (int i=1;i<=n;i++)
	{
		dis[i]=INF;
	}
	memset(vis,false,sizeof(vis));
	dis[sid]=0;
	vis[sid]=1;
	que.push(sid);
	while(!que.empty())
	{
		int cp=que.front();
		que.pop();
		vis[cp]=false;
		for (int i=head[cp];i!=-1;i=edge[i].next)
		{
			int eto=edge[i].to;
			int ew=edge[i].w;
			if(dis[eto]>dis[cp]+ew)
			{
				dis[eto]=dis[cp]+ew;
				cnt[eto]=cnt[cp]+1;
				if(cnt[eto]>=n) 
				{
					return;	
				}
				if(!vis[eto])
				{
					que.push(eto);
					vis[eto]=true;
				}
			}
		}
	}
}
int d[10000],p;
int main()
{
	memset(head,-1,sizeof(head));
	cin>>p;
	cin>>n;
	cin>>m;
	for (int i=1;i<=p;i++)
	{
		cin>>d[i];
	}
	for (int i=1;i<=m;i++)
	{
		int x,y,w;
		cin>>x>>y>>w;
		add(x,y,w);
		add(y,x,w);
	}
	for (int i=1;i<=n;i++)
	{
		SPFA(i);
		for (int j=1;j<=p;j++)
		{
			ans+=dis[d[j]];
		}
		num=min(num,ans);
		ans=0;
	}
	cout<<num<<endl;
	return 0;
}
2023/5/5 15:20
加载中...