zoukankan      html  css  js  c++  java
  • find the mincost route(floyd变形 无向图最小环)

    Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1630    Accepted Submission(s): 664


    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.
     
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 const int INF = 100000000;
     7 const int N = 110;
     8 int n,m;
     9 int map[N][N],dis[N][N];
    10 int ans;
    11 
    12 void floyd()
    13 {
    14     int i,j,k;
    15     ans = INF;
    16     for(k = 1; k <= n; k++)
    17     {
    18         for(i = 1; i < k; i++)
    19         {
    20             for(j = i+1; j < k; j++)
    21             {
    22                 ans = min(ans,dis[i][j]+map[j][k]+map[k][i]);
    23             }
    24         }
    25 
    26         for(i = 1; i <= n; i++)
    27         {
    28             for(j = 1; j <= n; j++)
    29             {
    30                 if(dis[i][j] > (dis[i][k]+dis[k][j]))
    31                     dis[i][j] = dis[i][k]+dis[k][j];
    32             }
    33         }
    34     }
    35 }
    36 int main()
    37 {
    38     while(~scanf("%d %d",&n,&m))
    39     {
    40         for(int i = 0; i <= n; i++)
    41         {
    42             for(int j = 0; j <= n; j++)
    43             {
    44                 map[i][j] = INF;
    45                 dis[i][j] = INF;
    46             }
    47         }
    48 
    49         while(m--)
    50         {
    51             int u,v,w;
    52             scanf("%d %d %d",&u,&v,&w);
    53             if(map[u][v] > w)
    54             {
    55                 map[u][v] = map[v][u] = w;
    56                 dis[u][v] = dis[v][u] = w;
    57             }
    58         }
    59         floyd();
    60         if(ans < INF)
    61             printf("%d
    ",ans);
    62         else printf("It's impossible.
    ");
    63 
    64     }
    65     return 0;
    66 }
    View Code
  • 相关阅读:
    webpack配置Jquery全局包及全局包插件
    webpack安装及使用
    Anywhere 随启随用的静态文件服务器
    sourcetree基本使用
    左边固定右边自适应的布局
    如何顺畅使用sourcetree可视化工具
    gulp前端自动化构建工具
    原生DOM操作方法小结
    java Scanner
    java 面向对象 封装
  • 原文地址:https://www.cnblogs.com/LK1994/p/3355729.html
Copyright © 2011-2022 走看看