100 pts ua 求条 qwq
查看原帖
100 pts ua 求条 qwq
749665
huta0楼主2024/10/31 10:27
#include<iostream>
#include<unordered_map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define int long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ai_jiang signed main()
using namespace std;
typedef long long ll;
using poly = vector<ll>;
namespace ai {
	constexpr int N = 1e5+10,M = 5e5+10;
	int t,n,m,k,a,b,c,dis[N],ptr[N];
	vector<pair<int,int>> e[N];
	vector<int> aa[32],bb[32];
	bool vis[N];
	struct node {
		int sum,now;
		bool operator<(const node &b) const {
		    return sum>b.sum;
		}
	}; 
	void dijk(int st) {
		priority_queue<node> q;
		q.push({0,st});
		fill(dis+1,dis+n+1,1e18);
		memset(vis,0,sizeof(vis));
		dis[st]=0;
		while(!q.empty()) {
			auto x=q.top();
			q.pop();
			if(vis[x.now]) continue;
			vis[x.now]=1;
			for(auto p:e[x.now]) {
				int v=p.first,w=p.second;
				//cout<<x.now<<" -> "<<v<<endl;
				if(dis[v]>dis[x.now]+w) {
					dis[v]=dis[x.now]+w;
					q.push({dis[v],v});
				}
			}
		}
	} 
	void rikka() {
	        rep(i,1,n) e[i].clear();
		cin>>n>>m>>k;
		rep(i,0,31) aa[i].clear(),bb[i].clear();
		rep(i,1,m) {
			cin>>a>>b>>c;
			e[a].push_back({b,c});
		}
		int p=__lg(n)+1;
		rep(i,1,k) cin>>ptr[i];
		rep(i,0,p-1) {
			rep(j,1,k) {
				if((ptr[j]>>i)&1) aa[i].push_back(ptr[j]);
				else bb[i].push_back(ptr[j]);
			}
		}
		int ans=2e9;
		rep(i,0,p-1) {
			e[0].clear(); e[n+1].clear();
			for(auto j:aa[i]) e[0].push_back({j,0});
			for(auto j:bb[i]) e[n+1].push_back({j,0});
			dijk(0);
			for(auto j:bb[i]) ans=min(ans,dis[j]);
			dijk(n+1);
			for(auto j:aa[i]) ans=min(ans,dis[j]);
		}
		cout<<ans<<'\n';
	}
}
using namespace ai;
ai_jiang {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>t;
    while(t--) rikka();
    return 0;
}
2024/10/31 10:27
加载中...