暴力过了这题
查看原帖
暴力过了这题
504459
huangwenkai楼主2021/8/22 15:29
#include<cstdio>
#include<bitset>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define il inline
#define Fo(i,a,b) for(register int i=a;i<=b;i++)
#define inf 0x3f3f3f3f3f3f3f3f
const int N=1e5+5;
int n,m,k;
ll ans;
struct eage{
	int to,vis;
};
struct node{
	int x;ll dis;
	inline bool operator <(const node &a)const{
		return a.dis<dis;
	}
};
template<typename T>
il void read(T &x){
	int f=1;x=0;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;
}
vector<eage>e[N];
vector<int>xy;
bitset<N>f,o;
int cnt=0;
il void init(){
	read(n);read(m);read(k);
	int a,b;ll c;
	while(m--){
		read(a);read(b);read(c);
		e[a].push_back((eage){b,c}); 
	}
	while(k--){
		read(a);f[a]=1;
		xy.push_back(a);
	}
}
il void dijkstra(int st){
	priority_queue<node>q;o.reset();
	q.push((node){st,0});
	while(!q.empty()){
		cnt++;
		int x=q.top().x;ll dis=q.top().dis;q.pop();		
		if(o[x])continue;o[x]=1;
		if(f[x]&&x!=st||dis>=ans){
			if(dis<ans)ans=dis;
			return;
		}
		Fo(i,0,int(e[x].size()-1)){	
			int u=e[x][i].to,w=e[x][i].vis;	
			q.push((node){u,dis+w});	
		} 			
	}
}
il void cclear(){
	Fo(i,1,n)e[i].clear();
	xy.clear();f.reset();
} 
int main(){
	int t;read(t);
	while(t--){
		init();ans=inf;
		Fo(i,0,int(xy.size()-1)){
			dijkstra(xy[i]);
			if(cnt>5000000)break; 
		}
		printf("%d\n",ans);
		cclear();
	}
	return 0;
} 
2021/8/22 15:29
加载中...