HDU1874

!!!!!!同样坑了我好久的题,因为是双向路径,所以每次输入W的时候要考虑W和已有路径的大小,map[a][b]  = map [ b ][a]= min(map[a][b],w);

FLOyd

#include <iostream>

#include <stdio.h>
#include <string.h>


#define maxn 300
#define INF 1000000


using namespace std;


int map[maxn][maxn];


int n,m;


void Flo( )
{
    for( int k = 0; k <n; k++)
     for( int i = 0; i < n; i++)
      for( int j = 0; j < n; j++)
      {
          if(map[i][j] > map[i][k] + map[k][j])
             map[i][j] = map[i][k] + map[k][j];
      }
      return ;
}


int main()
{
    int a,b,w;
   while(scanf("%d",&n)!= EOF)
   {
       for( int i = 0; i<n; i++)
        for( int j = 0; j<n; j++)
         {
             map[i][j] = (i == j ? 0 : INF);
             map[j][i] = map[i][j];
         }
       scanf("%d",&m);
       for( int i = 0 ;i < m; i++)
       {
           scanf("%d%d%d",&a,&b,&w);
           map[a][b] = map[b][a] = min(map[b][a],w);
       }
       Flo();
       scanf("%d%d",&a,&b);
       if(map[a][b] != INF)
        //cout<<map[a+1][b+1]<<endl;
        printf("%d\n",map[a][b]);
      else if(a == b)
       printf("0\n");
      else
       //cout<<"-1"<<endl;
       printf("-1\n");
   }

}



dij


  1. #include <cstdio>  
  2. #include <algorithm>  
  3. #include <cstring>  
  4. using namespace std;  
  5.   
  6. const int maxn = 200 + 10;  
  7. const int INF = 1000000000;  
  8. int d[maxn][maxn], G[maxn][maxn];  
  9.   
  10. int main()  
  11. {  
  12.     int N, M, i, j, k, u, v, w, S, T;  
  13.     while(scanf("%d%d", &N, &M) == 2)  
  14.     {  
  15.         for(i = 0; i < N; i++)  
  16.             for(j = 0; j < N; j++)  
  17.                 G[i][j] = i == j ? 0 : INF;  
  18.         for(i = 0; i < M; i++)      //建图  
  19.         {  
  20.             scanf("%d%d%d", &u, &v, &w);  
  21.             G[u][v] = G[v][u] = min(G[u][v], w);        //最坑人的地方!!!  
  22.         }  
  23.   
  24.         for(i = 0; i < N; i++)      //赋初值  
  25.             for(j = 0; j < N; j++)  
  26.                 d[i][j] = i == j ? 0 : INF;  
  27.   
  28.         bool vis[maxn];  
  29.         for(i = 0; i < N; i++)      //从i到任意点的最短距离  
  30.         {  
  31.             memset(vis, 0, sizeof(vis));  
  32.             for(j = 0; j < N; j++)        //N次寻路  
  33.             {  
  34.                 int x, y = INF;  
  35.                 for(k = 0; k < N; k++)  
  36.                     if(!vis[k] && d[i][k] <= y)  
  37.                         y = d[i][x = k];  
  38.                 vis[x] = 1;  
  39.                 for(k = 0; k < N; k++)  
  40.                     d[i][k] = min(d[i][k], d[i][x] + G[x][k]);  
  41.             }  
  42.         }  
  43.   
  44.         scanf("%d%d", &S, &T);  
  45.         if(d[S][T] == INF) printf("-1\n");  
  46.         else printf("%d\n", d[S][T]);  
  47.     }  
  48.     return 0;  
  49. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值