zzuoj 10408 最短路(dijistla||贝尔曼福特 求最少转站点)
2015-10-08 20:23
411 查看
题目大意:求从1到n的最少需要转车的次数,(m,n)代表m条路线,n个点(每个点是有方向的).
其余m行代表每辆车所经过的车站编号.求最少的从1到n的转车次数,若不能到达输出NO
思路:首先要处理输入,用字符串输入,并且注意位数>=2的车站编号的处理,将Map[][]中的所有关联的道路全部赋值为1
,整道题的思路是将点与点之间能够缩短的距离缩短后,直接1到n的最短距离输出-1.单源指的是从1到其他点
迪杰斯塔拉:
其余m行代表每辆车所经过的车站编号.求最少的从1到n的转车次数,若不能到达输出NO
思路:首先要处理输入,用字符串输入,并且注意位数>=2的车站编号的处理,将Map[][]中的所有关联的道路全部赋值为1
,整道题的思路是将点与点之间能够缩短的距离缩短后,直接1到n的最短距离输出-1.单源指的是从1到其他点
迪杰斯塔拉:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <map> #define inf 0x3f3f3f3f #define Max 20010 using namespace std; int Map[600][600],dis[600],n; char s[2000]; int arr[600]; bool vis[600]; void d() { int i,j,k; for(i=1; i<=n; i++) { dis[i]=Map[1][i]; } vis[1]=true; int ma,po; for(i=1; i<n; i++) { ma=inf; po=-1; for(j=1; j<=n; j++) { if(dis[j]<ma&&!vis[j]) { ma=dis[j]; po=j; } } vis[po]=true; for(j=1; j<=n; j++) { if(!vis[j]&&dis[j]>Map[po][j]+dis[po]) { dis[j]=Map[po][j]+dis[po]; } } } } int main() { int m,i,j,k,z; int cla; scanf("%d",&cla); while(cla--) { memset(vis,false,sizeof(vis)); for(i=1; i<=502; i++) { for(j=1; j<=502; j++) { if(i!=j) Map[i][j]=inf; else Map[i][j]=0; } } scanf("%d %d",&m,&n); getchar(); for(i=1; i<=m; i++) { z=0; gets(s); int l=strlen(s); for(j=0; j<l; j++) { if(s[j]!=' ') { int tmp=0; while(s[j]!=' '&&j<l) { tmp=tmp*10+(s[j]-'0'); j++; } arr[z++]=tmp; } } for(j=0; j<z-1; j++) for(k=j+1; k<z; k++) Map[arr[j]][arr[k] ]=1; } d(); if(dis !=0) printf("%d\n",dis -1); else printf("NO\n"); } return 0; } 贝尔曼福特: <pre name="code" class="cpp">#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <map> #define inf 0x3f3f3f3f #define Max 20010 using namespace std; struct node { int v,u,w; }q[1000]; int Map[600][600],dis[600],n,cnt; char s[2000]; int arr[600]; void add(int u,int v) { q[cnt].u=u; q[cnt].v=v; q[cnt++].w=1; } void BF() { int i,j,k; memset(dis,inf,sizeof(dis)); dis[1]=0; for(i=0;i<n-1;i++) { for(j=0;j<cnt;j++) { if(dis[q[j].v ]>dis[q[j].u]+q[j].w ) dis[q[j].v ]=dis[q[j].u ]+q[j].w; } } } int main() { int m,i,j,k,z; int cla; scanf("%d",&cla); while(cla--) { cnt=0; // memset(vis,false,sizeof(vis)); scanf("%d %d",&m,&n); getchar(); for(i=1; i<=m; i++) { z=0; gets(s); int l=strlen(s); for(j=0; j<l; j++) { if(s[j]!=' ') { int tmp=0; while(s[j]!=' '&&j<l) { tmp=tmp*10+(s[j]-'0'); j++; } arr[z++]=tmp; } } for(j=0; j<z-1; j++) for(k=j+1; k<z; k++) add(arr[j],arr[k]); } BF(); if(dis !=inf) printf("%d\n",dis -1); else printf("NO\n"); } return 0; }
相关文章推荐
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- 最短路径 -- spfa
- 单源最短路深度分析
- hdu5137最短路
- Dijkstra求最短路与次短路
- 2014西安邀请赛部分题解
- 2014 西安邀请赛状压DP
- 2013长沙邀请赛Travel in time
- 最短路dij——POJ 2387 Til the Cows Come Home题解
- 带负权的最短路bellman_ford——POJ 3259 Wormholes题解
- hdu 2544 最短路(简单的Floyd)
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- poj 2253 Frogger(dijkstra)
- hdu 2544 最短路 (Bellman_Ford算法)
- hdu 2690 Choose the best route (bellman_ford)
- hdu 1596 find the safest road(spfa算法)
- [BZOJ1266][AHOI2006][最短路][最小割]上学路线
- 最短路(Dijstra) 畅通工程续
- 最短路(Dijstra) 一个人的旅行