3 3 1 2 1 2 3 1 1 3 1 3 3 1 2 1 1 2 3 2 3 1
3 It's impossible.
大致思路:无向图的环最少有三个点,所以需要增加一部分求最小环;枚举中间点k,在用其更新最短路前,先找最小环,令1<=i<j<k,即k点必定不在i,j的最短路上,则这个环中至少有三个点,这个环的权值为:dis[i][j]+g[i][k]+g[k][j]
没仔细看样例,会存在重边,结果WA了
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dis[105][105],g[105][105],n,m,ans; void floyd() { ans=0x1f1f1f1f; for(int k=1;k<=n;++k) { for(int i=1;i<k;++i)//更新最小环 for(int j=i+1;j<k;++j) ans=min(ans,dis[i][j]+g[i][k]+g[k][j]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j)//更新最短路 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } int main() { int s,e,w; while(scanf("%d%d",&n,&m)==2) { memset(g,0x1f,sizeof(g)); memset(dis,0x1f,sizeof(dis)); while(m-->0) { scanf("%d%d%d",&s,&e,&w); if(w<g[s][e]) dis[s][e]=dis[e][s]=g[s][e]=g[e][s]=w; } floyd(); if(ans==0x1f1f1f1f) printf("It's impossible.\n"); else printf("%d\n",ans); } return 0; }