蒟蒻求助
查看原帖
蒟蒻求助
315005
White_gugu楼主2021/7/7 20:59
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
int a,b,c;
int f[220][1<<11];
int head[200200];
int num[101];
int to[200200];
int next[200200];
int val[200200];
int cnt=0;
int dl[200200];
bool bz[200200];
int ans=21000000;
int h=0,t=0;
void build(int u,int v,int w)
{
	to[cnt]=v;
	val[cnt]=w;
	next[cnt]=head[u];
	head[u]=cnt;
	cnt++;
}
void spfa(int S)
{
	while(h<t)
	{
		h++;
		int x=dl[h];
		bz[x]=0;
		for(int i=head[x];i!=-1;i=next[i])
		{
			int y=to[i];
			if(f[x][S]+val[i]<f[y][S])
			{
				f[y][S]=f[x][S]+val[i];
				if(!bz[y])
				{
					bz[y]=1;
					t++;
					dl[t]=y;
				}
			}
		}
	}
}
int main()
{
	scanf("%d %d %d",&n,&m,&k);
	memset(head,-1,sizeof(head));
	memset(f,127/3,sizeof(f));
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		build(a,b,c);
		build(b,a,c);
	}
	for(int i=1;i<=k;i++)
		scanf("%d",&num[i]),f[num[i]][1<<(i-1)]=0;
	for(int S=1;S<=(1<<k)-1;S++)
	{
		for(int i=1;i<=n;i++)
			for(int T=(S&(S-1));T;T=(S&(T-1)))
			{
				f[i][S]=min(f[i][T]+f[i][S^T],f[i][S]);
				if(f[i][S]!=f[0][0])
				t++,dl[t]=i,bz[i]=1;
			}
		spfa(S);
		h=0,t=0;
//		memset(bz,0,sizeof(bz));
	}
	for(int i=1;i<=n;i++)
	ans=min(ans,f[i][(1<<k)-1]);
	printf("%d",ans);
}

各位大佬看看

样例输出ans为初始值

2021/7/7 20:59
加载中...