NO
第八届河南省程序设计大赛
题解:刚开始也是没做出来,参考别人的代码,写出来的,这道题主要在于输入的时候不知道每行有多少个数字,所以要用字符串输入,
然后将里面的数字取出来,在输入m,n之后一定要用getchar(),来接收其后的换行,然后利用Dijkstra算法求最短路就行了
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int N=500+5; const int inf=0x3f3f3f3f; int map[N][N]; int n,m; ///Dijkstra算法 void dij() { int minn; int cost[N],vis[N]; memset(vis,0,sizeof(vis));///初始化 for(int i=1; i<=n; i++) { cost[i]=map[1][i];///求1——N的最短路 } vis[1]=1; int u; for(int i=2; i<=n; i++) { minn=inf; for(int j=1; j<=n; j++) { if(!vis[j]&&minn>cost[j]) { minn=cost[j]; u=j; } } vis[u]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&cost[j]>cost[u]+map[u][j]) { cost[j]=cost[u]+map[u][j]; } } } if(cost[n]>=inf) printf("NO\n"); else printf("%d\n",cost[n]-1);///让求的是经过了几站,不包括左后一个站。 } int main() { int t; scanf("%d",&t); while(t--) { int k; scanf("%d %d",&m,&n); getchar();///这个地方来接收换行 char s[2005]; int dis[N]; ///初始化:犯一个很脑残的错误就是i=N超过限定 for(int i=1; i<N; i++) { for(int j=1; j<N; j++) { if(i==j) map[i][j]=0; else map[i][j]=inf; } } for(int i=0; i<m; i++) { gets(s); k=0; for(int j=0; j<strlen(s); j++) { if(s[j]!=' ')///来获取每个数 { int sum=0; while(s[j]!=' '&&j<strlen(s))///这个数可能有多位N<=500; { sum=sum*10+(s[j]-'0'); j++; } dis[k++]=sum; } } for(int j=0; j<k; j++) { for(int v=j+1; v<k; v++) map[dis[j]][dis[v]]=1;///相邻的为1 } } ///Dijkstra算法 dij(); } return 0; }