• hdu 1599 find the mincost route 最小环


    题目链接:HDU - 1599

    杭州有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.".
     
    题意描述:中文题,如上所述。
    算法分析:用Floyd求解最小环的问题。有关最小环的定义和求解方法,大家可以去这个博客学习。
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define inf 0x7fffffff
     8 using namespace std;
     9 const int maxn=100+10;
    10 
    11 int n,m;
    12 int dist[maxn][maxn],edge[maxn][maxn];
    13 
    14 void floyd()
    15 {
    16     int ans=1000100;
    17     for (int i=1 ;i<=n ;i++)
    18     {
    19         for (int j=1 ;j<=n ;j++)
    20             dist[i][j]=edge[i][j];
    21     }
    22     for (int k=1 ;k<=n ;k++)
    23     {
    24         for (int i=1 ;i<k ;i++)
    25         {
    26             for (int j=i+1 ;j<k ;j++)
    27             {
    28                 if (dist[j][i]+edge[i][k]+edge[k][j]<1000100)
    29                     ans=min(ans,dist[j][i]+edge[i][k]+edge[k][j]);
    30             }
    31         }
    32         for (int i=1 ;i<=n ;i++)
    33         {
    34             for (int j=1 ;j<=n ;j++)
    35             {
    36                 if (dist[i][j]>dist[i][k]+dist[k][j])
    37                     dist[i][j]=dist[i][k]+dist[k][j];
    38             }
    39         }
    40     }
    41     if (ans==1000100) printf("It's impossible.
    ");
    42     else printf("%d
    ",ans);
    43 }
    44 
    45 int main()
    46 {
    47     while (scanf("%d%d",&n,&m)!=EOF)
    48     {
    49         for (int i=1 ;i<=n ;i++)
    50         {
    51             for (int j=1 ;j<=n ;j++)
    52                 edge[i][j]=1000100;
    53             edge[i][i]=0;
    54         }
    55         int x,y,cost;
    56         for (int i=0 ;i<m ;i++)
    57         {
    58             scanf("%d%d%d",&x,&y,&cost);
    59             if (edge[x][y]>cost) edge[x][y]=edge[y][x]=cost;
    60         }
    61         floyd();
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    深究AngularJS——自定义服务详解(factory、service、provider)
    学习AngularJs:Directive指令用法(完整版)
    理解Angular中的$apply()以及$digest()
    javascript关闭网页的几种方法
    grunt
    原生ajax
    服务器返回JSON,IE出现下载问题
    设计模式学习笔记——Mediator中介者模式
    Html.Partial
    SAML
  • 原文地址:https://www.cnblogs.com/huangxf/p/4491317.html
Copyright © 2020-2023  润新知