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

    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<iostream>
     2 #include<string>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 #define inf 1<<28;
     7 using namespace std;
     8 int dis[1001][1001];
     9 int map[1001][1001];
    10 int minn,n,m,data;
    11 void floyd()//求最小环
    12 {
    13     int it,jt,kt;
    14     for(kt=1;kt<=n;kt++)
    15     {
    16         for(it=1;it<kt;it++)
    17          for(jt=it+1;jt<kt;jt++)
    18           minn=min(minn,dis[it][jt]+map[it][kt]+map[kt][jt]);
    19         for(it=1;it<=n;it++)
    20          for(jt=1;jt<=n;jt++)
    21          {
    22            if(dis[it][jt]>dis[it][kt]+dis[kt][jt])
    23              dis[it][jt]=dis[it][kt]+dis[kt][jt];
    24          }
    25     }
    26     if(minn<data)
    27       printf("%d
    ",minn);
    28     else
    29       printf("It's impossible.
    ");
    30 }
    31 int main()
    32 {
    33     int i,j,k;
    34     int a,b,c,d,w;
    35     while(scanf("%d%d",&n,&m)!=EOF)
    36     {
    37         data=inf;
    38         minn=data;
    39         for(i=0;i<=n;i++)
    40          for(j=0;j<=n;j++)
    41          {
    42            map[i][j]=data;
    43            dis[i][j]=data;
    44          }
    45         while(m--)//初始化
    46         {
    47             scanf("%d%d%d",&a,&b,&w);
    48             if(map[a][b]>w)
    49              {
    50                  map[a][b]=map[b][a]=w;
    51                  dis[a][b]=dis[b][a]=w;
    52              }
    53 
    54 
    55         }
    56         floyd();
    57     }
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    勿忘初心
    欧拉函数与数论的结合UVA11426
    法雷级数
    欧拉函数及其应用
    poyla计数问题
    组合计数问题中容斥原理的应用
    数学问题当中的一些基本计数问题
    HDU4642博弈好题
    KMP算法在字符串中的应用
    UVA11722概率问题之线性规划
  • 原文地址:https://www.cnblogs.com/sdau--codeants/p/3430279.html
Copyright © 2011-2022 走看看