poj 2244 最短路 和 poj 1874 畅通工程续 dijkstra(迪杰斯特拉)
2016-04-30 20:37
357 查看
畅通工程续,题目链接,点击这里,
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 42205 Accepted Submission(s): 15620
Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(1<=N~200,1<=M~1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B小于N,A!=B,X(1~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
这个可以用弗洛伊德算法,也可以用迪杰斯特拉算法,很标准的模板题,注意的细节也有很多。听学长说,还可以用邻接表优化,但我不会优化,还要学。
以下是的迪杰斯特拉算法的代码。
另外补了一道和也差不多是模板题的迪杰斯特拉。
poj 1874 题目链接,畅通工程续。
AC代码:
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 42205 Accepted Submission(s): 15620
Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(1<=N~200,1<=M~1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B小于N,A!=B,X(1~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
这个可以用弗洛伊德算法,也可以用迪杰斯特拉算法,很标准的模板题,注意的细节也有很多。听学长说,还可以用邻接表优化,但我不会优化,还要学。
以下是的迪杰斯特拉算法的代码。
#include<iostream>//c++ #include<cmath>//数学公式 #include<cstdlib>//malloc #include<cstring> #include<string> #include<cstdio>//输入输出 #include<algorithm>//快排 #include<queue>//队列 #include<functional>//优先队列 #include<stack>//栈 #include<vector>//容器 //#include<map>//地图 if continue #include<math.h> #include<string.h> #define INF 0x3f3f3f #define inf 10000000 using namespace std; int map[205][205],dis[205]; int book[205];// 访问数组; int main() { int n,m,a,b,x,minm,u; while(~scanf("%d%d",&n,&m)) { for(int i=0; i<n; i++)// 初始化矩阵; for(int j=0; j<n; j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } for(int i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&x); if(x<map[a][b]) { map[a][b]=x;// 无向图 map[b][a]=x; } } scanf("%d%d",&a,&b);// a,b是要寻找的边; for(int i=0; i<n; i++) dis[i]=map[a][i];// 初始化距离数组为a点; memset(book,0,sizeof(book)); book[a]=1; for(int i=0; i<n-1; i++)//迪杰斯特拉 核心; { minm=INF; for(int j=0; j<n; j++) { if(book[j]==0&&dis[j]<minm) { minm=dis[j]; u=j; } } book[u]=1;//标记,不再访问; for(int v=0; v<n; v++)//松弛 if(map[u][v]<INF) if(dis[v]>dis[u]+map[u][v]) dis[v]=dis[u]+map[u][v]; } printf("%d\n",dis[b]==INF?-1:dis[b]); } return 0; }
另外补了一道和也差不多是模板题的迪杰斯特拉。
poj 1874 题目链接,畅通工程续。
AC代码:
#include<iostream>//c++ #include<cmath>//数学公式 #include<cstdlib>//malloc #include<cstring> #include<string> #include<cstdio>//输入输出 #include<algorithm>//快排 #include<queue>//队列 #include<functional>//优先队列 #include<stack>//栈 #include<vector>//容器 //#include<map>//地图 if continue #include<math.h> #include<string.h> #define INF 0x3f3f3f #define inf 10000000 using namespace std; int map[205][205],dis[205],book[205]; int main() { int n,m,a,b,x,minm,u; while(scanf("%d%d",&n,&m)&&n&&m) { for(int i=0; i<n; i++)// 初始化矩阵; { for(int j=0; j<n; j++) map[i][j]=INF; map[i][i]=0; } while(m--) { scanf("%d%d%d",&a,&b,&x); a--; b--; if(x<map[a][b]) { map[a][b]=x;// 无向图 map[b][a]=x; } } dis[0]=0; for(int i=0; i<n; i++) dis[i]=map[0][i]; memset(book,0,sizeof(book)); book[0]=1; for(int i=1; i<n; i++) { minm=INF; for(int j=0; j<n; j++) { if(!book[j]&&dis[j]<minm) { minm=dis[j]; u=j; } } book[u]=1; for(int v=0; v<n; v++) if(map[u][v]<INF) if(dis[v]>dis[u]+map[u][v]&&!book[v]) dis[v]=dis[u]+map[u][v]; } printf("%d\n",dis[n-1]==INF?-1:dis[n-1]); } return 0; }
相关文章推荐
- Maven搭建(二)使用m2eclipse创建web项目
- Spinner 获取当前选中项
- 实用知识:CoreLocation的使用(地图展示)
- WebStorm快捷键
- Nhbernate
- poj2828 Buy Tickets(单点更新模拟队列)
- SQL集萃(一) Case…When…Then 实现无表字段拼表格
- Leetcode 14. Longest Common Prefix
- Scrapy爬取美女图片续集
- sscanf和sprintf的用法
- Java的线程
- Java循环练习:求1+(1*2)+(1*2*3)+(1*2*3*4)+(1*2*3*4*5)的和
- 4月4日作业
- 欢迎使用CSDN-markdown编辑器
- 使用rem时chrome中的bug
- 欢迎使用CSDN-markdown编辑器
- UIScrollView 的代理方法简单注解
- C++ 运算符重载
- linux头文件详解
- mongdb安装