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;
    }
    

      

  • 相关阅读:
    hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations)
    更高的压缩比,更好的性能–使用ORC文件格式优化Hive
    InfluxDB基本概念和操作
    InfluxDB部署
    Zookeeper运维小结--CancelledKeyException
    Zookeeper源码编译为Eclipse工程(win7下Ant编译)
    ZooKeeper Observers解决节点过多时写性能下降问题
    ZooKeeper日志与快照文件简单分析
    ZooKeeper Administrator's Guide A Guide to Deployment and Administration(吃别人嚼过的馍没意思,直接看官网资料)
    ZOOKEEPER解惑
  • 原文地址:https://www.cnblogs.com/sola1994/p/3901777.html
Copyright © 2011-2022 走看看