ABC338F求调
  • 板块学术版
  • 楼主OIer_ljb
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/1/28 14:53
  • 上次更新2024/1/28 16:23:08
查看原帖
ABC338F求调
602009
OIer_ljb楼主2024/1/28 14:53

RT,#1和#3WA了

#include<cstdio>
#include<cstring>
const int N=25,S=2200005,inf=1e9;
int n,m,u,v,w,d[N][N],em[N],f[S][N],ans=inf;
inline int min(int x,int y){return x<y?x:y;}
main()
{
	scanf("%d%d",&n,&m);em[1]=1;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)d[i][j]=inf;
	for(int i=2;i<=n+1;++i)em[i]=em[i-1]*2;
	int s=em[n+1]-1;
	for(int i=1;i<=m;++i)scanf("%d%d%d",&u,&v,&w),d[u][v]=w;
	for(int k=1;k<=n;++k)
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=s;++j)f[j][i]=inf;
	for(int i=1;i<=n;++i)f[em[i]][i]=0;
	for(int i=1;i<=s;++i)
		for(int j=1;j<=n;++j)
			if(i&em[j])
			for(int k=1;k<=n;++k)
				if(!(i&em[k]))
				{
					int ii=i|em[k];
					f[ii][k]=min(f[ii][k],f[i][j]+d[j][k]);
				}
	for(int i=1;i<=n;++i)ans=min(ans,f[s][i]);
	if(ans==inf)printf("No");
	else printf("%d",ans);
}
2024/1/28 14:53
加载中...