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

    畅通工程续

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 28050    Accepted Submission(s): 10157


    Problem 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
     
    Author
    linle
     
    Source
     
    Recommend
    lcy
     
     
    这道题是一道最短路题,这里要注意重边的问题,否则同一条边会有多种走法。
    Dijkstra算法:
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<stdlib.h>
     5 #include<algorithm>
     6 using namespace std;
     7 const int MAXN=2000+10;
     8 const int INF=0x3f3f3f3f;
     9 int dis[MAXN],vis[MAXN],w[MAXN][MAXN];
    10 int n,m,s,e;
    11 void dijkstra(int s)
    12 {
    13     memset(vis,0,sizeof(vis));
    14     for(int i=0;i<n;i++)
    15         dis[i]=INF;
    16     dis[s]=0;//从起点开始走起
    17     for(int i=0;i<n;i++)
    18     {
    19         int temp,maxn=INF;
    20         for(int j=0;j<n;j++)
    21         {
    22             if(!vis[j]&&dis[j]<maxn)
    23             {
    24                 maxn=dis[j];
    25                 temp=j;
    26             }
    27         }
    28         vis[temp]=1;
    29         for(int i=0;i<n;i++)
    30             dis[i]=min(dis[i],dis[temp]+w[temp][i]);
    31     }
    32 }
    33 int main()
    34 {
    35     //freopen("in.txt","r",stdin);
    36     while(scanf("%d %d",&n,&m)!=EOF)
    37     {
    38         for(int i=0;i<n;i++)
    39             for(int j=0;j<n;j++)
    40                 w[i][j]=INF;
    41         int star,en,val;
    42         for(int i=0;i<m;i++)
    43         {
    44             scanf("%d %d %d",&star,&en,&val);
    45             if(val<w[star][en])//防止重边
    46                 w[star][en]=w[en][star]=val;
    47         }
    48         scanf("%d %d",&s,&e);
    49         dijkstra(s);
    50         if(dis[e]==INF)
    51             printf("-1
    ");
    52         else
    53             printf("%d
    ",dis[e]);
    54     }
    55     return 0;
    56 }
    View Code

     Floyd算法:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<stdlib.h>
     4 #include<algorithm>
     5 using namespace std;
     6 const int MAXN=210;
     7 const int INF=0x3f3f3f3f;
     8 int n,m;
     9 int dis[MAXN][MAXN];
    10 void Floyd()
    11 {
    12     for(int k=0;k<n;k++)
    13         for(int i=0;i<n;i++)
    14             for(int j=0;j<n;j++)
    15                 if(dis[i][j]>dis[i][k]+dis[k][j])
    16                     dis[i][j]=dis[i][k]+dis[k][j];
    17 }
    18 int main()
    19 {
    20     //freopen("in.txt","r",stdin);
    21     while(scanf("%d %d",&n,&m)!=EOF)
    22     {
    23         for(int i=0;i<n;i++)
    24             for(int j=0;j<n;j++)
    25                 dis[i][j]=(i==j?0:INF);
    26         int star,en,val;
    27         for(int i=0;i<m;i++)
    28         {
    29             scanf("%d %d %d",&star,&en,&val);
    30             if(val<dis[star][en])
    31                 dis[star][en]=dis[en][star]=val;
    32         }
    33         int s,e;
    34         scanf("%d %d",&s,&e);
    35         Floyd();
    36         if(dis[s][e]==INF)
    37             printf("-1
    ");
    38         else
    39             printf("%d
    ",dis[s][e]);
    40     }
    41     return 0;
    42 }
    View Code
     
  • 相关阅读:
    Restful
    RESTful
    UUID使用
    Security注解:@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全
    java Spring定时器 每个季度执行一次
    给文字加小手样式
    java 根据年月获取当前年月的最后一天,获取当前年月有多少天
    mui Picker DtPicker 固定内容以及变动内容Picker 不同情况下的应用 提高效率
    java封装返回结果应用 利用反射机制 返回结果以及错误信息
    java 封装返回结果实体类 返回结果以及错误信息
  • 原文地址:https://www.cnblogs.com/clliff/p/3904968.html
Copyright © 2011-2022 走看看