题目大意:求从1到n的最少需要转车的次数,(m,n)代表m条路线,n个点(每个点是有方向的).
其余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[n]!=0) printf("%d\n",dis[n]-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[n]!=inf) printf("%d\n",dis[n]-1); else printf("NO\n"); } return 0; }