畅通工程续

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

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
思路:也是属于一道模板教程题,不过有一点需要注意就是考虑起点终点相同的这种状况。
ac代码:

#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int vis[210],map[210][210],dis[210],n,m,beg,end;
void init(){for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(i==j)map[i][j]=map[j][i]=0;elsemap[i][j]=map[j][i]=INF;}
}
void dijkstra(){int i,flag=0;memset(vis,0,sizeof(vis));for(i=0;i<n;i++)dis[i]=map[beg][i];vis[beg]=1;for(i=0;i<n;i++){int j,k,temp=INF;for(j=0;j<n;j++)if(!vis[j]&&temp>dis[j])temp=dis[k=j];if(k==end){flag=1;break;}vis[k]=1;for(j=0;j<n;j++)if(!vis[j]&&dis[j]>dis[k]+map[k][j])dis[j]=dis[k]+map[k][j];}if(flag)printf("%d\n",dis[end]);elseprintf("-1\n");
}
int main(){while(scanf("%d%d",&n,&m)!=EOF){int i;init();for(i=0;i<m;i++){int a,b,cost;scanf("%d%d%d",&a,&b,&cost);if(map[a][b]>cost)map[a][b]=map[b][a]=cost;}scanf("%d%d",&beg,&end);if(beg==end){//就这一点挺坑人的,刚做的时候没考虑到,居然还有起点和终点相同这种情况。 printf("0\n");continue ;}dijkstra();}return 0;
}

SPFA算法实现:

ac代码:
#include<stdio.h>
#include<string.h>
#include<queue>
#define N 210
#define M 2010
#define INF 0x3f3f3f3f
using namespace std;
int dis[N],vis[N],head[N],n,m,edgenum;
struct node{int from,to,cost,next;
}edge[M];
void init(){edgenum=0;memset(head,-1,sizeof(head));
}
void add(int u,int v,int w){node E={u,v,w,head[u]};edge[edgenum]=E;head[u]=edgenum++;
}
void spfa(int beg,int end){queue<int>q;q.push(beg);memset(vis,0,sizeof(vis));memset(dis,INF,sizeof(dis));vis[beg]=1;dis[beg]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;int i;for(i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(dis[v]>dis[u]+edge[i].cost){dis[v]=dis[u]+edge[i].cost;if(!vis[v]){vis[v]=1;q.push(v);}}}}if(dis[end]==INF)printf("-1\n");elseprintf("%d\n",dis[end]);
}
int main(){while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0){init();while(m--){int a,b,cost;scanf("%d%d%d",&a,&b,&cost);add(a,b,cost);add(b,a,cost);}int beg,end;scanf("%d%d",&beg,&end);spfa(beg,end);}return 0;
}

第三种写法

FLOYD算法:
AC代码:
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int dis[300][300],n;
void init(){memset(dis,INF,sizeof(dis));for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i==j)dis[i][j]=dis[j][i]=0;
}
void floyd(){int i,j,k;for(k=0;k<n;k++)for(i=0;i<n;i++)if(dis[i][k]!=INF){for(j=0;j<n;j++)if(dis[i][j]>dis[i][k]+dis[k][j])dis[i][j]=dis[i][k]+dis[k][j];}
}
int main(){int m;//scanf("%d",&m);while(scanf("%d%d",&n,&m)!=EOF){init();while(m--){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(dis[a][b]>c)dis[a][b]=dis[b][a]=c;}floyd();int beg,end;scanf("%d%d",&beg,&end);if(dis[beg][end]==INF)printf("-1\n");elseprintf("%d\n",dis[beg][end]);}return 0;
}

HDOJ--1874--畅通工程续相关推荐

  1. 杭电 hdu 1874 畅通工程续

    第二次 /* THE PROGRAM IS MADE BY PYY */ /*------------------------------------------------------------- ...

  2. HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:          http://acm.hdu.edu.cn/showproblem.php?pid=1874 ...

  3. HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)

    畅通工程续 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修 ...

  4. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  5. HDU 1874 畅通工程续 Floyd

    畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Time Limit: 3000/1000 MS (Java/Others) Memory L ...

  6. poj 2244 最短路 和 poj 1874 畅通工程续 dijkstra(迪杰斯特拉)

    畅通工程续,题目链接,点击这里, 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 1874畅通工程续(基础Floyd)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. HDU 1874 畅通工程续 2008浙大研究生复试热身赛(2)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. HDU 1874 畅通工程续

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  10. 杭电1874畅通工程续

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

最新文章

  1. VMWARE HOST-ONLY方式共享上网
  2. 《数学之美》第5章 隐含马尔可夫模型
  3. 【 MATLAB】Subspace algorithm Simulation of TOA - Based Positioning
  4. 摄像机丢失信号及偏色的检测思路
  5. 质量兴农战略规划-农业大健康·韩长赋:质量效益和竞争力
  6. PHP7 ini 配置大全
  7. python random用法_python random 的用法
  8. linux cpu核数和线程数,cpu个数、核数和线程的理解
  9. python语言常量_python---01.各类计算机语言,python历史,变量,常量,数据类型,if条件...
  10. (王道408考研操作系统)第一章计算机系统概述-第一节1:操作系统基本概念以及目标和功能
  11. 关于C++ const成员的一些细节
  12. Fedora 9与Windows共享文件
  13. 个人计算机虚拟化,CPU虚拟化是什么?家用电脑需要开启虚拟化吗?
  14. 全网首发:12306抢票算法大曝光?(十张图搞定)
  15. 计算机卷死,一位计算机教师死了,警方在床底发现一张纸,上面写着一些特殊的符号,这... #119615-推理漫画-侦探推理-33IQ...
  16. pycharm更新pip提示Requirement already satisfied
  17. java nio oio_java面试题NIO与OIO的区别
  18. java为Word插入图片水印
  19. vr计算机方面的应用,AR和VR到底有什么区别,分别应用在哪些方面?
  20. 建设数字经济引领型城市 CDEC2022中国数字智能生态大会广州举行

热门文章

  1. pytorch相关用法
  2. 自然语言处理——词性标注实战
  3. 李宏毅机器学习——半监督学习
  4. Django2.0中URL的路由机制
  5. Netty内存池泄漏问题
  6. 类加载与 Java主类加载机制解析
  7. 深入Linux设备驱动程序内核机制
  8. 什么是网站物理结构、逻辑结构
  9. 敏捷无敌(11)之兵不厌诈
  10. 二维数组 : 旋转矩阵