Dijkstra WA求调
查看原帖
Dijkstra WA求调
763878
Jerry_heng楼主2024/8/7 08:17
#include<bits/stdc++.h>
#define db double
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
#define int long long
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f; 
}
struct node{
	int pos,val;
	bool operator<(const node &x)const{
		return val>x.val;
	}
};
const int mxn=1e5+10;
int s,t,n,m,k,a[mxn],dis[mxn],ans;
vector<pii>E[mxn];
bool vis[mxn];
void dijkstra(){
	priority_queue<node>q;
	q.push((node){0,0});
	for(int i=1;i<=n+1;i++)
		dis[i]=1e18,vis[i]=0;
    dis[1]=0;
	while(!q.empty()){
        int u=q.top().pos;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(auto v:E[u]){
            if(dis[v.fi]>dis[u]+v.se){
                dis[v.fi]=dis[u]+v.se;
                if(!vis[v.fi])q.push((node){v.fi,dis[v.fi]});
            }
        }
    }
    ans=min(ans,dis[n+1]);
}
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    int T=read();
    while(T--){
    	s=0,t=n+1;
    	n=read(),m=read(),k=read();
    	for(int i=0;i<=n+1;i++)
    		E[i].clear();
    	for(int i=1;i<=m;i++){
    		int u=read(),v=read(),w=read();
    		E[u].pb(mkp(v,k));
    		E[v].pb(mkp(u,k));
    	}
    	for(int i=1;i<=k;i++)
    		a[i]=read();
    	ans=1e18;
    	for(int i=0;i<20;i++){
    		for(int j=1;j<=k;j++){
    			if((j>>i)&1)E[0].pb(mkp(a[j],0));
    			else E[a[j]].pb(mkp(n+1,0));
    		}
    		dijkstra();
    		for(int j=1;j<=k;j++)
    			if(!((j>>i)&1))E[a[j]].pop_back();
    		E[0].clear();
    	}
        printf("%lld\n",ans);
    }
    return 0;
}
2024/8/7 08:17
加载中...