- 寻找道路
- 2014-12-09 21:36:08 @
求大牛纠错,我的思路是先从终点DFS回起点找到所有可以到终点的路,标记路上所有的点。再从起点BFS到终点,中途筛掉出度没被标记的点。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<fstream>
#include <cstdlib>
using namespace std;
typedef vector<int>::iterator iter;
vector<int> a[10010];
vector<int> b[10010];
int i,n,m,e,o,k,l,s,t,q,p,d[10010]={0},ss[200000]={0},sss[10010]={0};
int dfs(int x)
{
if(x==s)
return 1;
for(iter z=b[x].begin();z!=b[x].end();z++)
d[x]=max(d[x],dfs(*z));
return(d[x]);
}
int main()
{
/*freopen("test.in","r",stdin);
freopen("test.out","w",stdout);*/
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&e,&o);
if(e==o)
continue;
a[e].push_back(o);
b[o].push_back(e);
}
scanf("%d%d",&s,&t);
dfs(t);
if(d[t]==0)
{
printf("-1\n");
return 0;
}
e=1;o=1;
ss[e]=s;
d[s]=1;
sss[s]=1;
q=-1;
while(e<=o)
{
q++;
for(i=e;i<=o;i++)
if(ss[i]==t)
{
printf("%d\n",q);
return 0;
}
k=o;
for(i=e;i<=o;i++)
{
l=k;
for(iter j=a[ss[i]].begin();j!=a[ss[i]].end();j++)
if(d[*j]==1)
{
if(sss[*j]==0)
{
k++;
ss[k]=*j;
sss[*j]=1;
}
}
else
if(ss[i]!=s)
{
k=l;
break;
}
}
e=o+1;
o=k;
for(i=e;i<=o;i++)
ss[i-e+1]=ss[i];
o=o-e+1;
e=1;
}
printf("-1\n");
return 0;
}
1 条评论
-
FloodBenz LV 8 @ 2015-05-21 12:16:05
思路是对的 但是可能哪里写萎了。。。
- 1