题解 P2296 【寻找道路】
有人问我,这题用普通的二维数组要爆呀,内存不够呀· · ·
甚至有人提交出现了MLE(不多见!)
于是,我回复:vector不就行啦???
千万人
恍然大悟· · ·
#include <cstdio>
#include <vector>
using namespace std;
int n,m,started,ended;
int arr[10001]={0};
int que[10001],head,tail,step[10001],book[10001];
vector <int> e[10001],re[10001];
void dfs(int u)
{
if(arr[u]==1) return;
arr[u]=1;
for(int i=0;i<re[u].size();i++)
{
dfs(re[u][i]);
}
return ;
}
int main()
{
int u,v;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d",&u,&v);
e[u].push_back(v);
re[v].push_back(u);
}
scanf("%d %d",&started,&ended);
dfs(ended);
for(int i=1;i<=n;i++)
{
if(arr[i]==1)
{
for(int j=0;j<e[i].size();j++)
{
v=e[i][j];
if(arr[v]==0)
{
arr[i]=-1;
}
}
}
}
head=1;
tail=1;
que[tail]=started;
step[tail]=0;
tail++;
int flag=0;
while(head<tail)
{
u=que[head];
for(int i=0;i<e[u].size();i++)
{
v=e[u][i];
if(book[v]==0 && arr[v]==1)
{
book[v]=1;
que[tail]=v;
step[tail]=step[head]+1;
tail++;
}
if(v==ended)
{
flag=1;
break;
}
}
if(flag==1)
{
break;
}
head++;
}
if(head<tail)
{
printf("%d",step[tail-1]);
}
else
{
printf("-1");
}
return 0;
}