zoukankan      html  css  js  c++  java
  • 【最短路】Vijos P1046 观光旅游

    题目链接:

      https://vijos.org/p/1046

    题目大意

      给n个点(n<=100),m条无向边(m<=10000),问这张图的最小环长度。

      (注意:无自环,同一个点对之间的多条路最终只算作1条而不是2个点的环,被这里坑了一次)

    题目思路:

      【最短路】

      无向图最小环问题。

      有向图最小环的长度为2,但是这题因为是无向图,所以环的长度至少为3。所以可以枚举k为中间点,求i到j不经过k的最短路最后加上Di,k和Dk,j即为答案。

      用floyd,时间复杂度是O(n3).

     1 //
     2 //by coolxxx
     3 //
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<string>
     7 #include<iomanip>
     8 #include<memory.h>
     9 #include<time.h>
    10 #include<stdio.h>
    11 #include<stdlib.h>
    12 #include<string.h>
    13 #include<stdbool.h>
    14 #include<math.h>
    15 #define min(a,b) ((a)<(b)?(a):(b))
    16 #define max(a,b) ((a)>(b)?(a):(b))
    17 #define abs(a) ((a)>0?(a):(-(a)))
    18 #define lowbit(a) (a&(-a))
    19 #define sqr(a) ((a)*(a))
    20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
    21 #define eps 1e-8
    22 #define J 10000
    23 #define MAX 0x7f7f7f7f
    24 #define PI 3.1415926535897
    25 #define N 104
    26 using namespace std;
    27 int n,m,lll,ans,cas;
    28 int map[N][N],f[N][N];
    29 void floyd()
    30 {
    31     int i,j,k;
    32     for(k=1;k<=n;k++)
    33     {
    34         for(i=1;i<k;i++)
    35         {
    36             if(map[i][k]==MAX)continue;
    37             for(j=i+1;j<k;j++)
    38             {
    39                 if(map[k][j]==MAX || f[i][j]==MAX)continue;
    40                 cas=f[i][j]+map[i][k]+map[k][j];
    41                 ans=min(ans,cas);
    42             }
    43         }
    44         for(i=1;i<=n;i++)
    45         {
    46             if(f[i][k]==MAX || i==k)continue;
    47             for(j=1;j<=n;j++)
    48                 if(f[k][j]!=MAX && i!=j && j!=k)
    49                     f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    50         }
    51     }
    52 }
    53 int main()
    54 {
    55     #ifndef ONLINE_JUDGE
    56 //    freopen("1.txt","r",stdin);
    57 //    freopen("2.txt","w",stdout);
    58     #endif
    59     int i,j,k,x,y,z;
    60 //    while(~scanf("%s",s1))
    61     while(~scanf("%d",&n))
    62     {
    63         memset(map,0x7f,sizeof(map));
    64         scanf("%d",&m);
    65         ans=MAX;
    66         for(i=1;i<=m;i++)
    67         {
    68             scanf("%d%d%d",&x,&y,&z);
    69             map[y][x]=map[x][y]=min(map[x][y],z);
    70         }
    71         memcpy(f,map,sizeof(map));
    72         floyd();
    73         if(ans!=MAX)printf("%d
    ",ans);
    74         else puts("No solution.");
    75     }
    76     return 0;
    77 }
    78 
    79 
    80 /*
    81 //
    82 
    83 //
    84 */
    View Code
  • 相关阅读:
    JAVA面试题 启动线程是start()还是run()?为什么?
    Java面试题 equals()与"=="的区别?
    Java面试题之数据库三范式是什么?
    很全的Python 面试题 github
    链家二手房 爬虫
    15个重要Python面试题 测测你适不适合做Python?
    静态链接和动态链接
    Python里的拷贝
    GIL线程全局锁 协程
    Python中的作用域
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5423416.html
Copyright © 2011-2022 走看看