无敌了这卡常
查看原帖
无敌了这卡常
688873
amyang楼主2024/9/1 16:30

第一遍测AC,后面测一直TLE

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e6+10;
ll n,m,U[maxn],V[maxn],T[maxn],k,Q,h[maxn],nex[maxn],w[maxn],to[maxn],tot,vis[maxn],d[500][500],ans,K[10],visk[10];
void dfs(ll now,ll fa,ll an){
	if(now==k+1){
		ans=min(ans,an+d[fa][n]);
		return;
	}
	for(ll i=1;i<=k;i++)if(!visk[i]){
		visk[i]=1;
		ll u=U[K[i]],v=V[K[i]],t=T[K[i]];
		dfs(now+1,u,an+d[fa][v]+t);
		dfs(now+1,v,an+d[fa][u]+t);
		visk[i]=0;
	}
}
void add(ll a,ll b,ll t){
	w[++tot]=t;
	to[tot]=b;
	nex[tot]=h[a];
	h[a]=tot;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=m;i++){
		scanf("%lld%lld%lld",U+i,V+i,T+i);
		add(U[i],V[i],T[i]);
		add(V[i],U[i],T[i]);
	}
	for(ll x=1;x<=n;x++){
		for(ll i=0;i<=n;i++)d[x][i]=1e12;
		d[x][x]=0;
		for(ll i=1;i<=n;i++)vis[i]=0;
		while(true){
			ll u=0;
			for(ll i=1;i<=n;i++)if(!vis[i]&&d[x][u]>d[x][i])u=i;
			if(!u)break;
			vis[u]=1;
			for(ll i=h[u];i;i=nex[i]){
				d[x][to[i]]=min(d[x][to[i]],d[x][u]+w[i]);
			}
		}
	}
	scanf("%lld",&Q);
	while(Q--){
		scanf("%lld",&k);
		ans=1e12;
		for(ll i=1;i<=k;i++)scanf("%lld",K+i);
		dfs(1,1,0);
		printf("%lld\n",ans);
	}
	return 0;
}

求调

2024/9/1 16:30
加载中...