hdoj 1874 畅通工程续【三种方法】
2015-08-17 17:13
423 查看
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36712 Accepted Submission(s): 13566
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
2008浙大研究生复试热身赛(2)——全真模拟
这个是以前写的注释比较全~
#include<cstdio> #include<algorithm> #define MAX 0x3f3f3f using namespace std; int dis[211],vis[211];//dis数组 求距离,vis数组 做标记 int len[211][211];//构建图 int n,m,s,t; int min(int x,int y)//求出x,y中较小的数 { if(x >= y) return y; return x; } void dijkstra() { int i,j,k; for( i = 0; i < n; i++) { dis[i] = MAX; vis[i] = 0; } dis[s] = 0;//起点已经在图中 dis记作0 while(1) { k = -1; for( i = 0; i < n ; i++) if(!vis[i] && (k==-1 ||dis[i] < dis[k]))//标记过的点排除掉,两点的长度保持短的 k = i; if(k == -1) break;//退出循环 vis[k] = 1;// 说明点k跟起点有连接,标记为1 for(i = 0; i < n; i++) dis[i] = min( dis[i], dis[k]+len[i][k]);//判断看是否将边松弛,dis总是为最短的那条边 } if(dis[t] >= 10000)//题目要求 距离不超过 1万 printf("-1\n");//不符题意 else printf("%d\n",dis[t]); } int main() { int i,j,k,a,b,x; while(scanf("%d%d",&n,&m)!=EOF) { for( i = 0; i < n; i++) for( j = 0; j < n; j++) len[i][j] = MAX;//先把两点间距离设为MAX while(m--) { scanf("%d%d%d",&a,&b,&x); if(len[a][b] > x)//千万要有此判断!!! { len[a][b] = x;//a,b两点间距离为 x len[b][a] = x; } } scanf("%d%d",&s, &t);//输入起点、终点 dijkstra(); } return 0; }
2016.2.2
dijkstra:
#include<cstdio> #include<cstring> #include<cmath> #define Wi(a) while(a--) #define Si(a) scanf("%d", &a) #define Pi(a) printf("%d\n", (a)) #define mem(a, b) memset(a, (b), sizeof(a)) #define INF 0x3f3f3f #include<algorithm> using namespace std; const int mx = 210; int n, m; int s, t; int map[mx][mx]; int dis[mx], vis[mx]; void dijkstra() { mem(vis, 0); int i, j, k; for(i = 0; i < n; i++) dis[i] = INF; dis[s] = 0; while(1){ k = -1; for(i = 0; i < n; i++) { if((k==-1 || dis[k] > dis[i]) && !vis[i]) k = i; } if(k == -1) break; vis[k] = 1; for(i = 0; i < n; i++) { dis[i] = min(dis[i], dis[k]+map[i][k]); } } if(dis[t] == INF) puts("-1"); else Pi(dis[t]); } int main(){ while(scanf("%d%d", &n, &m)==2) { int i, j, k; int a, b, c; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { map[i][j] = INF; } } Wi(m) { scanf("%d%d%d", &a, &b, &c); if(map[a][b] > c) map[a][b] = map[b][a] = c; } scanf("%d%d", &s, &t); dijkstra(); } return 0; }
floyd:
#include<cstdio> #include<cstring> #include<cmath> #define Wi(a) while(a--) #define Si(a) scanf("%d", &a) #define Pi(a) printf("%d\n", (a)) #define mem(a, b) memset(a, (b), sizeof(a)) #define INF 0x3f3f3f #include<algorithm> using namespace std; const int mx = 210; int n, m; int s, t; int map[mx][mx]; int dis[mx], vis[mx]; void floyd() { int i, j, k; for(k = 0; k < n; k++) { for(i = 0; i < n; i++) { for(j = 0; j < n; j++) map[i][j] = min(map[i][j], map[i][k]+map[k][j]); } } if(map[s][t] == INF) puts("-1"); else Pi(map[s][t]); } int main(){ while(scanf("%d%d", &n,&m)==2) { int i, j; for(i = 0; i < n; i++) { for(j = 0; j < n; j++) map[i][j] = ( i==j?0:INF ); } int a, b, c; Wi(m){ scanf("%d%d%d", &a, &b, &c); if(map[a][b] > c) { map[a][b] = map[b][a] = c; } } scanf("%d%d", &s, &t); floyd(); } return 0; }
SPFA:
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #define Wi(a) while(a--) #define Si(a) scanf("%d", &a) #define Pi(a) printf("%d\n", (a)) #define mem(a, b) memset(a, (b), sizeof(a)) #define INF 0x3f3f3f #include<algorithm> using namespace std; const int mx = 200+10; const int mr = 10000+10; int n, m; int s, t; int dis[mx], vis[mx], use[mx]; struct node{ int from, to, val, next; }; node edge[mr]; int head[mx], edgenum; void addedge(int u, int v, int w) { node E = { u, v, w, head[u] }; edge[edgenum] = E; head[u] = edgenum++; } void init() { edgenum = 0; mem(head, -1); } void spfa() { queue<int> q; mem(dis, INF); mem(vis, 0); mem(use, 0); q.push(s); dis[s] = 0; vis[s] = 1; use[s]++; while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = 0; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if(dis[v] > dis[u]+edge[i].val) { dis[v] = dis[u]+edge[i].val; if(!vis[v]){ vis[v] = 1; q.push(v); use[v]++; if(use[v] > n) return ; } } } } if(dis[t] > 10000) puts("-1"); else Pi(dis[t]); } void getmap() { int a, b, c; Wi(m){ scanf("%d%d%d", &a, &b, &c); addedge(a, b, c); addedge(b, a, c); } scanf("%d%d", &s,&t); } int main() { while(scanf("%d%d", &n,&m)==2) { init(); getmap(); spfa(); } return 0; }
相关文章推荐
- 项目开发规范,数据库设计规范
- js 回到顶部的实现
- 接口 详解
- Nhibernate 智能提示 以及其他类库智能提示
- not1,not2,bind1st和bind2nd详解
- Mahone的CTS研究笔记(三):CTS的测试内容概况(上)
- 安装Oracle的时候报SWAP空间不足的处理方法
- mysql 体系结构
- HashTable与HashMap的区别
- Logcat输出2次封装
- Content-Range HTTP 下载文件原理
- The Cow Lexicon
- java内存管理:深入Java内存区域
- 有缺陷的枚举类型 和 C++11中的强类型枚举
- 2015 Multi-University Training Contest 8(HDOJ5384、5389)
- 步入高级程序猿殿堂之一前言
- cmd下并行执行appium +maven+Testng test
- The Cow Lexicon
- Unity中各种常用文件夹的用处
- 黑马程序员——JAVA之final所定义的