求助TLE#5#6#7
查看原帖
求助TLE#5#6#7
1040155
__free楼主2024/8/8 22:20
#include <bits/stdc++.h>
using namespace std;

const int maxn=100005;

int x,y,z;
int n,m,st,T,k,a[maxn],b[maxn],vis[maxn];
long long dis[maxn],ans;

vector <int >son[maxn];
vector <int >val[maxn];
queue <int >q;

void read(){
	cin>>n>>m>>k;
	ans=0x3f3f3f3f3f3f;
	for(int i=0;i<maxn;i++){
		son[i].clear();
		val[i].clear();
	}
	memset(dis,0x3f,sizeof(dis));
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		if(x==y) continue;
		son[x].push_back(y);
		val[x].push_back(z);
	}
	for(int i=1;i<=k;i++){
		cin>>x;
		b[i]=x;
		a[x]=1;
	}
}

long long work(){
	q.push(0);
	vis[0]=1;
	while(!q.empty()){
		int now=q.front();
		q.pop();
//		cout<<now<<' '<<son[now].size()<<' '<<dis[now]<<endl;
		vis[now]=0;
		for(int i=0;i<son[now].size();i++){
			int j=son[now][i];
			if(j==0) continue;
//			cout<<" "<<j<<endl;
			if(dis[j]>dis[now]+val[now][i]){
				dis[j]=dis[now]+val[now][i];
				if(!vis[j]){
					vis[j]=1;
					q.push(j);
				}
			}
		}
	}
	return dis[100003];
}

void solve(){
	read();
	for(int i=0;i<=15;i++){
		memset(dis,0x3f,sizeof(dis));
		memset(vis,0,sizeof(vis));
		dis[0]=0;
		son[0].clear();
		val[0].clear();
//		cout<<i<<endl;
		for(int j=1;j<=k;j++){
			if(((1<<i)&j)!=0){
				son[0].push_back(b[j]);
				val[0].push_back(0);
			}
			if(((1<<i)&j)==0){
				son[b[j]].push_back(100003);
				val[b[j]].push_back(0);
			}
		}
		ans=min(ans,work());
		for(int j=1;j<=k;j++){
			if(((1<<i)&j)==0){
				son[b[j]].pop_back();
				val[b[j]].pop_back();
			}
		}
		////
		memset(dis,0x3f,sizeof(dis));
		memset(vis,0,sizeof(vis));
		dis[0]=0;
		son[0].clear();
		val[0].clear();
//		cout<<i<<endl;
		for(int j=1;j<=k;j++){
			if(((1<<i)&j)==0){
				son[0].push_back(b[j]);
				val[0].push_back(0);
			}
			if(((1<<i)&j)!=0){
				son[b[j]].push_back(100003);
				val[b[j]].push_back(0);
			}
		}
		ans=min(ans,work());
		for(int j=1;j<=k;j++){
			if(((1<<i)&j)!=0){
				son[b[j]].pop_back();
				val[b[j]].pop_back();
			}
		}
	}
	////
	cout<<ans<<endl;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>T;
	while(T--) solve();
	return 0;
}

这题是不是卡SPFA

2024/8/8 22:20
加载中...