COJ1036(Minimum Circle)

题目链接

题目大意:给定一个有向图(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 }

 

posted @ 2012-05-01 22:22  BeatLJ  阅读(178)  评论(0编辑  收藏  举报