zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    ubuntu系统安装初始化脚本
    21_多线程
    20_IO
    19_异常
    18_集合
    17_内部类和常用类
    16_接口
    15_abstract,static,final
    14_面向对象
    13_数组
  • 原文地址:https://www.cnblogs.com/algorithms/p/2478264.html
Copyright © 2011-2022 走看看