题目:http://111.231.101.32/problem.php?id=1005(自建OJ,欢迎光临)
分析:
比如线路3 6 7 5,则3可以到达6,7,5,从而赋值f[3][6,7,5]=1,6可以到达7,5,从而赋值f[6][7,5]=1。下面就是最短路问题。
易困惑点:
写好代码后,在DEVC++上过了所有测试点,但提交OJ后却卡掉很多点,原因在于DEVC++把回车符与换行符当作换行符处理,而OJ是分得很清楚的。
比如
3 6 7 5
4 5
用getchar()去读入第一行,得到的是字符3,空格,字符6,空格,字符7,回车符(ASCII码为13),换行符(ASCII码为10)。
为了在DEVC++与OJ上通用,采用以下代码:
c=getchar();
if(c==13) c=getchar();
对于DEVC++,直接认为第一行代码吸收的是换行符,从而不执行第二行代码的主体。
对于洛谷,或者hustoj,因为先吸收回车符,从而执行第二行代码的主体而吸收掉换行符。
另外需要注意的是,文件结束是EOF。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
int m,n,a[501],f[501][501];
char c;
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)f[i][j]=1e9;
c=getchar();
while(c==13){/*回车键13*/
c=getchar();
}
for(int i=1;i<=m;i++){
int t=0,s=0;
char c;
while(1){
c=getchar();
while(c==' '){
c=getchar();
}
t++;
s=0;
while(c<='9' && c>='0'){
s=s*10+c-'0';
c=getchar();
}
a[t]=s;
while(c==13)/*回车键13*/
c=getchar();
/*换行键10,或者到了文件结束标志EOF*/
if(c==10||c==EOF)break;
}
for(int j=1;j<t;j++)
for(int k=j+1;k<=t;k++)
f[ a[j] ][ a[k] ]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j && i!=k && j!=k
&& f[i][j]>f[i][k]+f[k][j])
f[i][j]=f[i][k]+f[k][j];
if(f[1][n]==1e9)cout<<"NO\n";
else cout<<f[1][n]-1<<endl;
return 0;
}