zoukankan      html  css  js  c++  java
  • hdu 1599 find the mincost route(flyod求最小环)

    Problem Description
    杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,并且花费越少越好。
    Input
    第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。
    接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。
    Output
    对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It's impossible.".
     
    Sample Input
    3 3
    1 2 1
    2 3 1
    1 3 1
    3 3
    1 2 1
    1 2 3
    2 3 1
     
    Sample Output
    3 
    It's impossible.

    这道题题意很简单,就是求最小环。如果用最朴素的最短路解决,复杂度很高。怎么办?用Floyed解决,枚举每一个点K,和连接它的两个点i,j(i,j均<k),使i,j,k构成环。则ans=min{ans,dis[i][j]+g[k][i]+g[k][j]},根据Floyed原理,若i,j<k则dis[i][j]与k无关。所以要现计算最值,在做更新。此外,若输入格式给出的是边权的形式,一定注意重边问题,这点很坑爹!!!

     1 #pragma comment(linker, "/STACK:1024000000,1024000000")
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<math.h>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<set>
    10 #include<bitset>
    11 #include<map>
    12 #include<vector>
    13 #include<stdlib.h>
    14 #include <stack>
    15 using namespace std;
    16 int dirx[]={0,0,-1,1};
    17 int diry[]={-1,1,0,0};
    18 #define PI acos(-1.0)
    19 #define max(a,b) (a) > (b) ? (a) : (b)  
    20 #define min(a,b) (a) < (b) ? (a) : (b)
    21 #define ll long long
    22 #define eps 1e-10
    23 #define MOD 1000000007
    24 #define N 106
    25 #define inf 1<<26
    26 int n,m;
    27 int mp[N][N];
    28 int dis[N][N];
    29 int ans_mincost;
    30 void flyod(){
    31     for(int k=1;k<=n;k++){
    32         for(int i=1;i<k;i++){
    33             for(int j=i+1;j<k;j++){
    34                 ans_mincost=min(ans_mincost,mp[i][k]+mp[k][j]+dis[i][j]);
    35             }
    36         }
    37         for(int i=1;i<=n;i++){
    38             for(int j=1;j<=n;j++){
    39                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    40             }
    41         }
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     while(scanf("%d%d",&n,&m)==2){
    48         
    49         for(int i=1;i<=n;i++){
    50             for(int j=1;j<=n;j++){
    51                 if(i==j) mp[i][j]=dis[i][j]=0;
    52                 else mp[i][j]=dis[i][j]=inf;
    53             }
    54         }
    55         
    56         for(int i=0;i<m;i++){
    57             int a,b,d;
    58             scanf("%d%d%d",&a,&b,&d);
    59             if(d<mp[a][b])
    60                mp[a][b]=mp[b][a]=dis[a][b]=dis[b][a]=d;
    61         }
    62         
    63         ans_mincost=inf;
    64         
    65         flyod();
    66         
    67         if(ans_mincost!=inf)
    68            printf("%d
    ",ans_mincost);
    69         else 
    70            printf("It's impossible.
    ");
    71         
    72     }
    73     return 0;
    74 }
    View Code
     
  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4830492.html
Copyright © 2011-2022 走看看