SPFA能不能做这道题
查看原帖
SPFA能不能做这道题
814145
XXh0919楼主2024/5/24 17:54

TLE*2,看了题解的

#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
const int N=3e6+15,mod=998244353;

int n,p,c;
int a[N];
int head[N],to[N*2],val[N*2],nxt[N*2],idx=1;
int dis[N],vis[N];

void add(int u,int v,int w){
	to[idx]=v;
	val[idx]=w;
	nxt[idx]=head[u];
	head[u]=idx++;
}

void spfa(int x){
	queue<int>q;
	memset(vis,0,sizeof vis);
	rep(i,1,p){
		dis[i]=0x3f3f3f3f;
	}
	q.push(x);
	dis[x]=0;
	vis[x]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=nxt[i]){
			if(dis[to[i]]>val[i]+dis[u]){
				dis[to[i]]=val[i]+dis[u];
				if(!vis[to[i]]){
					q.push(to[i]);
					vis[to[i]]=1;
				}
			}
		}
	}
}

signed main(){
	ios::sync_with_stdio(0);
	memset(head,-1,sizeof head);
	cin>>n>>p>>c;
	rep(i,1,n)cin>>a[i];
	rep(i,1,c){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	rep(i,1,c){
		add(0,i,0);
		add(i,0,0);
	}
	int minx=1e18;
	rep(i,1,p){
		spfa(i);
		int ans=0;
		rep(j,1,n){
			ans+=dis[a[j]];
		}
		minx=min(minx,ans);
	}
	cout<<minx<<endl;
	return 0;
} 
2024/5/24 17:54
加载中...