题目:http://blog.csdn.net/qq_35786326/article/details/78836996
题意:
帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到S公园的过程中换车的次数最少。
思路:
在输入是处理好可通车号,在用广搜求最短路径数。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#define LL long long
using namespace std;
inline LL read(){
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}//超快输入流
int n,m,x[105][105],y[1005][1005],c[10005],father[10005],state[10005];
void bfs()
{
int i,j,k,a,b,tail,head;
father[1]=0;tail=1;head=0;state[1]=1;
do
{
head++;
for(i=1;i<=n;i++)
{
if(y[state[head]][i]==1&&state[head]!=i)
{
tail++;
father[tail]=head;
c[tail]=c[head]+1;
state[tail]=i;
if(state[tail]==n)
{
printf("%d",c[tail]-1);
tail=0;
return;
}
}
for(j=1;j<=tail-1;j++) if(state[j]==state[tail]){tail--;}
}
}
while(head<tail);
printf("NO");
}
int main()
{
int i,j,ij,k,a,p;char s;
m=read();n=read();
for(i=1;i<=m;i++)
{
k=0;
a=0;
s=getchar();
while(s!='\n')
{
if(s==' ')
{
k++;
x[i][k]=a;
a=0;
}
else a=a*10+s-48;
s=getchar();
}
k++;x[i][k]=a;
for(j=1;j<=k;j++)
{
for(ij=j;ij<=k;ij++)
y[x[i][j]][x[i][ij]]=1;//处理可通车号,0为不可以,1为可以
}
}
bfs();//广搜
return 0;
}