题目大意:给定一个有向图(n<100),求最小圈。
分析:任何一个圈至少有两个点,在圈中任取两个点i,j,圈的长度可以看成是d[i][j]+d[j][i],所以先用floyd求任意点对的最短距离,然后枚举点对求最小圈长。时间复杂度为O(N3)。
View Code
1 #include <stdio.h> 2 #define MIN(a,b) ((a)<(b)?(a):(b)) 3 #define N 100 4 #define INF 0x7fffffff 5 int n,m; 6 int d[N][N]; 7 int main() 8 { 9 int i,j,k,t,u,v,w,ans; 10 scanf("%d",&t); 11 while(t--) 12 { 13 scanf("%d%d",&n,&m); 14 for(i=0;i<n;i++) 15 { 16 for(j=i+1;j<n;j++) d[i][j]=d[j][i]=INF; 17 } 18 for(i=0;i<m;i++) 19 { 20 scanf("%d%d%d",&u,&v,&w); 21 d[u][v]=w; 22 } 23 for(k=0;k<n;k++) 24 for(i=0;i<n;i++) 25 for(j=0;j<n;j++) 26 if(d[i][k]!=INF&&d[k][j]!=INF&&d[i][k]+d[k][j]<=d[i][j]) 27 d[i][j]=d[i][k]+d[k][j]; 28 ans=INF; 29 for(i=0;i<n;i++) 30 { 31 for(j=i+1;j<n;j++) if(d[i][j]!=INF&&d[j][i]!=INF) ans=MIN(ans,d[i][j]+d[j][i]); 32 } 33 if(ans==INF) puts("-1"); 34 else printf("%d\n",ans); 35 } 36 }