#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<bitset>
#include<cstdlib>
using namespace std;
vector <int> f[10005],g[10005];
queue <int> q;
int n,m,a,b,s,t,maxn;
int dis[10005];
bool vis[10005],del[10005],iin[10005],dee[10005];
void deletee(int x)
{
del[x]=false;
for (int i=0;i<g[x].size();i++)
if (del[g[x][i]])//here
deletee(g[x][i]);
}
void sp()
{
for (int i=1;i<=n;i++)
if (del[i])
for (int j=0;j<g[i].size();j++)
dee[g[i][j]]=true;
for (int i=1;i<=n;i++)
dee[i]=dee[i]|del[i];
}
void spfa()
{
memset(dis,127,sizeof(dis));
dis[s]=0;
q.push(s);
iin[s]=true;
while (!q.empty())
{
int k=q.front();q.pop();iin[k]=false;
for (int i=0;i<f[k].size();i++)
if (!dee[f[k][i]]&&dis[k]+1<dis[f[k][i]])
{
dis[f[k][i]]=dis[k]+1;
if (!iin[f[k][i]])
{
q.push(f[k][i]);
iin[f[k][i]]=true;
}
}
}
}
int main()
{
freopen ("road.in","r",stdin);
//freopen ("road.out","w",stdout);
scanf ("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf ("%d%d",&a,&b);
if (a!=b)
{
f[a].push_back(b);
g[b].push_back(a);
}
}
scanf ("%d%d",&s,&t);
memset(del,true,sizeof(del));
deletee(t);sp();
spfa();
if (dis[t]>100000) printf ("-1");
else printf ("%d",dis[t]);
return 0;
}NOIP 2014 Day2 T2 寻找道路
最新推荐文章于 2024-01-10 18:49:20 发布
本文介绍了一种基于图论的最短路径算法实现方法。通过使用邻接表表示图,并结合队列进行广度优先搜索(SPFA),实现了从源点到目标点的最短路径计算。特别地,该实现考虑了节点删除和可达性判断。
282

被折叠的 条评论
为什么被折叠?



