题目:http://www.luogu.org/problem/show?pid=2296#
分析:简单图论,搜搜搜,就A了……
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int Tmax=10005,inf=2147483647;
int n,m,s,t,v[Tmax],dist[Tmax];
bool ok;
vector<int> G[Tmax];
queue<int> q;
void bfs()
{
int i,a,end;
for(i=1;i<=n;i++) dist[i]=inf;
q.push(t);
dist[t]=0;
while(!q.empty())
{
a=q.front();
q.pop();
if(a==s){
ok=true;
printf("%d",dist[s]);
return;
}
end=G[a].size();
for(i=0;i<end;i++)
if(v[G[a][i]]==1){
dist[G[a][i]]=min(dist[G[a][i]],dist[a]+1);
q.push(G[a][i]);
}
}
return;
}
void name(int num)
{
int i,end=G[num].size();
v[num]=-1;
for(i=0;i<end;i++)
v[G[num][i]]=-1;
return;
}
void dfs(int num)
{
int i,end=0;
if(!G[num].empty())
end=G[num].size();
v[num]=1;
for(i=0;i<end;i++)
if(!v[G[num][i]])
dfs(G[num][i]);
return;
}
void add(int from,int to)
{
G[from].push_back(to);
return;
}
int main()
{
int i,a,b;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
add(b,a);
}
scanf("%d %d",&s,&t);
dfs(t);
for(i=1;i<=n;i++)
if(v[i]==0) name(i);
bfs();
if(!ok) printf("-1");
return 0;
}