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 }

 

你可能感兴趣的:(ini)