100分TLE一个点求助
查看原帖
100分TLE一个点求助
740093
SamHe楼主2024/7/22 17:33
#include<bits/stdc++.h>
using namespace std;
int t;
int n,m,k,cnt;
struct Edge{
	int to,nxt,val;
}edge[1000010];
long long las[1000010],vis[1000010];
struct node{
	int x;
	long long y;
	bool operator<(node hh) const{return y>hh.y;}
};
void add(int u,int v,int w){
	cnt++; 
	edge[cnt].to=v;
	edge[cnt].nxt=las[u];
	las[u]=cnt;
	edge[cnt].val=w; 
}
priority_queue<node> pq;
bitset<5000010>dd,ff;
long long Distria(int now){
	while(!pq.empty()){
		pq.pop();
	}
	dd.reset();
	memset(vis,0x3f,sizeof vis);
	pq.push((node){now,0});
	vis[now]=0;
	while(!pq.empty()){
		node t=pq.top();
		pq.pop();
		int u=t.x;
		if(ff[u]&&u!=now){
			return vis[u];
		}
		if(!dd[u]){
			dd[u]=1;
			for(int i=las[u];i;i=edge[i].nxt){
				int v=edge[i].to;
				int w=edge[i].val;
				if(vis[v]>vis[u]+w){
					vis[v]=vis[u]+w;
					pq.push((node){v,vis[v]});
				}
			}
		}
	}
	return 0x3f3f3f3f3f3f3f3f;
}
int main(){
	cin>>t;
	while(t--){
		cnt=0;
		memset(las,0,sizeof(las));
		ff.reset();
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=m;i++){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);	
		}
		for(int i=1;i<=k;i++){
			int x;
			scanf("%d",&x);
			ff[x]=1;
		}
		long long ans=0x3f3f3f3f3f3f3f3f;
		for(int i=1;i<=n;i++){
			if(ff[i]){
				ans=min(Distria(i),ans);
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2024/7/22 17:33
加载中...