zoukankan      html  css  js  c++  java
  • Floyd求最小环 HDU1599

     
    杭州有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<algorithm>
     3 #include<string>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<set>
     7 #include<map>
     8 #include<queue>
     9 #include<time.h>
    10 using namespace std; 
    11 typedef long long ll;
    12 const int maxn = 100000;
    13 const int mod = 1e9+7;
    14 #define pb push_back
    15 const int INF = 100000000;
    16 using namespace std;
    17 int mp[150][150];
    18 int dis[150][150];
    19 int n,m;
    20 int ans ;
    21 void init()
    22 {
    23     for(int i=0;i<=n;i++)
    24     {
    25         for(int j=0;j<=n;j++)
    26         {
    27             mp[i][j] = INF;
    28             dis[i][j]  = INF;
    29         }
    30     } 
    31 }
    32 int main()
    33 {
    34     
    35     while(~scanf("%d%d",&n,&m))
    36     {
    37         //memset(mp,INF,sizeof(mp));
    38         //memset(dis,INF,sizeof(dis));
    39         for(int i=0;i<m;i++)
    40         {
    41             int u,v,w;
    42             cin>>u>>v>>w;
    43             if(w < mp[u][v])
    44             {
    45                 mp[u][v] =  mp[v][u]  = w;
    46                 dis[u][v] = dis[v][u] = w;
    47             }
    48         }
    49         ans = INF;
    50         for(int k= 1;k<=n;k++)
    51         {
    52             for(int i=1;i<k;i++)
    53             {
    54                 for(int j= i+1;j<k;j++)
    55                     ans = min(ans, dis[i][j] + mp[i][k]+ mp[k][j]);
    56             }
    57 
    58             for(int i = 1;i<=n;i++)
    59             {
    60                 for(int j= 1;j<=n;j++)
    61                 {
    62                     dis[i][j] = min(dis[i][k] + dis[k][j] , dis[i][j]);
    63                 }
    64             }
    65         }   
    66 
    67         if(ans<INF)
    68         {
    69             cout<<ans<<endl;
    70         }
    71         else
    72         {
    73             cout<<"It's impossible."<<endl;
    74         }
    75     }
    76 
    77     //system("pause");
    78 }
    View Code

    中途发现memset对二维数组重置的问题

    使用memset对dis 和 mp 清空时会 WA;

    此问题待解决

     
  • 相关阅读:
    Windows2012 cannot access netapp CIFS share
    Import SHA2 SSL cert to Windows IIS7
    IE11登陆交行网银崩溃
    Understanding and Managing SMTP Virtual Servers
    IIS SMTP Queue stuck
    C#夯实基础之多线程三:线程的优先级
    C#夯实基础之多线程二:主线程、前台线程与后台线程
    ORA-00257: archiver error. Connect internal only, until freed.
    C#夯实基础之多线程一:初识多线程
    在Oracle中恢复被DROP掉的表
  • 原文地址:https://www.cnblogs.com/lightWh1te/p/13815762.html
Copyright © 2011-2022 走看看