zoukankan      html  css  js  c++  java
  • hdu 1874 通畅工程续(最短路 dijkstra floyd)

    Description
    某省自从实行了很多年的畅通工程计划后,终于修建了很多路。
    不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,
    而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

    Input
    本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),
    分别代表现有城镇的数目 和 已修建的道路的数目。
    城镇分别以0~N-1编号。

    接下来是M行道路信息。
    每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),
    表示城镇A和城镇B之间有一条长度为X的双向道路。
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

    Output
    对于每组数据,请在一行里输出最短需要行走的距离。
    如果不存在从S到T的路线,就输出-1.

    Sample Input
    3 3
    0 1 1
    0 2 3
    1 2 1
    0 2
    3 1
    0 1 1
    1 2

    Sample Output
    2
    -1

    这题可以 用dijkstra或者floyd求出最短路

    但是有坑 输入时两个城市间可能有多条路 需要判断得出最小的一条

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll __int64
    #define MAXN 1000
    #define INF 300000000
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    int d[230][230];
    int main()
    {
        int n,m;
        int i,j;
        int u,v,w;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=0;i<=n;i++)        
                for(j=0;j<=n;j++)
                {                
                    if(i==j) d[i][j]=0;
                    else     d[i][j]=INF;
                }        
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&w);
                if(d[u][v]>w)           //这里需要判断
                   d[u][v]=d[v][u]=w;
            }
            for(int k=0;k<n;k++)        
                for(int i=0;i<n;i++)            
                    for(int j=0;j<n;j++)                
                        if(d[i][j]>d[i][k]+d[k][j])
                            d[i][j]=d[i][k]+d[k][j];                          
            
            int f,t;
            scanf("%d%d",&f,&t);
            if(d[f][t]<INF)   cout<<d[f][t]<<endl;
            else              cout<<"-1
    ";
        }
        return 0;
    }
    

      

    用dijkstra时间复杂度更低些

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll __int64
    #define MAXN 1000
    #define INF 300000000
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    int w[230][230];
    int d[230];
    int vis[230];
    int main()
    {
        int n,m,i,j;
        int u,v,ww,s,t;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            mem(vis,0);
            for(i=0;i<n;i++)
                for(j=0;j<n;j++)            
                   w[i][j]=INF;            
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&ww);
                if(w[u][v]>ww) w[u][v]=w[v][u]=ww;
            }
            scanf("%d%d",&s,&t);
            for(i=0;i<n;i++)  d[i]=i==s?0:INF;        
            for(i=0;i<n;i++)
            {
                int x,m=INF;
                for(int y=0;y<n;y++) 
                    if(!vis[y]&&d[y]<=m) m=d[x=y];
                vis[x]=1;
                for(int y=0;y<n;y++)
                    if(d[y]>d[x]+w[x][y])            
                       d[y]=d[x]+w[x][y];            
            }
            if(d[t]<INF)
            cout<<d[t]<<endl;
            else
                cout<<"-1"<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    docker常用命令
    2020/10/10,饮食男女-对教条主义的补充和现实的摸索
    2020/08/24,约束力
    2020/08/21,迷茫的时候就去工作
    2020/08/21,神秘和平易近人
    2020/08/21,圣人和教条
    2020/07/21,翡翠梦境
    2020/10/10,生活不是阶段式跳跃的,是螺旋式的。
    2020/07/23,再论point,way,moment,time
    2020/07/13,旅游的意义是什么
  • 原文地址:https://www.cnblogs.com/sola1994/p/3901777.html
Copyright © 2011-2022 走看看