80pts求条
查看原帖
80pts求条
1095315
PJM2008楼主2025/7/31 16:27

跑两遍dijkstra做的,WA #8,10,11 求条

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M=100009;
const ll INF=1e18+9;
ll T,n,m,k,c,d1[M],d2[M],from[M],to[M],u,v,w,mn;
bool vis1[M],vis2[M];
vector <ll> G1[M],wG1[M],G2[M],wG2[M];
int main(){
	cin>>T;
	while(T--){
		cin>>n>>m>>k;
		for(ll i=1;i<=n;i++) d1[i]=d2[i]=INF,vis1[i]=vis2[i]=0,G1[i].clear(),wG1[i].clear(),G2[i].clear(),wG2[i].clear();
		for(ll i=1;i<=m;i++){
			cin>>u>>v>>w;
			G1[u].push_back(v); wG1[u].push_back(w);
			G2[v].push_back(u); wG2[v].push_back(w);
		}
		priority_queue <pair<ll,ll> > pq;
		for(ll i=1;i<=k;i++){
			cin>>c; d1[c]=d2[c]=0; from[c]=to[c]=c; pq.push(make_pair(0,c));
		}
		while(!pq.empty()){
			v=pq.top().second; pq.pop();
			if(vis1[v]) continue;
			vis1[v]=1;
			for(ll i=0;i<G1[v].size();i++){
				u=G1[v][i],w=wG1[v][i];
				if(d1[u]>d1[v]+w){
					d1[u]=d1[v]+w; from[u]=from[v]; pq.push(make_pair(-d1[u],u));
				}
			}
		}
		while(!pq.empty()){
			v=pq.top().second; pq.pop();
			if(vis2[v]) continue;
			vis2[v]=1;
			for(ll i=0;i<G2[v].size();i++){
				u=G2[v][i],w=wG2[v][i];
				if(d2[u]>d2[v]+w){
					d2[u]=d2[v]+w; to[u]=to[v]; pq.push(make_pair(-d2[u],u));
				}
			}
		}
		mn=INF;
		for(ll i=1;i<=n;i++){
			for(ll j=0;j<G1[i].size();j++){
				u=G1[i][j],w=wG1[i][j];
				if(from[i]!=to[u]) mn=min(mn,d1[i]+w+d2[u]);
			}
		}
		cout<<mn<<endl;
	}
	return 0;
}
2025/7/31 16:27
加载中...