CODEVS 3731 寻找道路

来源:互联网 发布:linux修改ssh端口号 编辑:程序博客网 时间:2024/06/10 12:32

【题意】

点击打开链接

【解题方法】反向跑bfs把可以连通的点标,然后正向跑BFS。

【AC 代码】

#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn=200005;struct edge{int to,next;}E[maxn*2];int head[10005],tot;int n,m,S,T;int u[maxn],v[maxn];int dis[maxn];bool vis[10005];int q[10005];void init(){    tot=0;    memset(head,0,sizeof(head));}void addedge(int u,int v){    E[++tot].to=v,E[tot].next=head[u],head[u]=tot;}bool check(int u){    for(int i=head[u]; i; i=E[i].next){        int v=E[i].to;        if(!vis[v]) return false;    }    return true;}void bfs1(){    int fron=0,tail=1;    q[0]=T;vis[T]=1;    while(fron!=tail)    {        int now=q[fron];fron++;        for(int i=head[now]; i; i=E[i].next){            int v=E[i].to;            if(!vis[v]){                vis[v]=1;                q[tail++]=v;            }        }    }}bool bfs2(){    int fron=0,tail=1;    q[0]=S;    dis[S]=0;    while(fron!=tail)    {        int now=q[fron];fron++;        if(!check(now)) continue;        for(int i=head[now]; i; i=E[i].next){            if(dis[E[i].to]==-1){                dis[E[i].to]=dis[now]+1;                q[tail++]=E[i].to;                if(E[i].to==T){                    printf("%d\n",dis[T]);                    return 1;                }            }        }    }    return 0;}int main(){    scanf("%d%d",&n,&m);    init();    for(int i=1; i<=m; i++){        scanf("%d%d",&u[i],&v[i]);        if(u[i]!=v[i]) addedge(v[i],u[i]);    }    scanf("%d%d",&S,&T);    bfs1();    tot=0;    memset(head,0,sizeof(head));    memset(dis,-1,sizeof(dis));    for(int i=1; i<=m; i++){        if(u[i]!=v[i]) addedge(u[i],v[i]);    }    if(!vis[S]) {puts("-1"); return 0;}    if(!bfs2()) puts("-1");    return 0;}


0 0
原创粉丝点击