zoukankan      html  css  js  c++  java
  • NOIP2014 寻找道路

    题目

    vijos1909

    题解

    先从终点反向bfs一遍,找出所有无法到达终点的点,那么这些点的上一个点均不能放入路径中,标记下来,最后从起点bfs满足条件的点,得到最短路径

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #define N 1000005
    using namespace std;
    
    int n,m,s,t;
    vector<int> to[N],from[N];
    
    queue<int> q;bool f[N];
    void bfs(int x)
    {
    	q.push(x);f[x]=1;
    	while(!q.empty())
    	{
    		int k=q.front();q.pop();
    		int sz=from[k].size();
    		for(int i=0;i<sz;i++)
    		{
    			int kk=from[k][i];
    			if(!f[kk]) f[kk]=1,q.push(kk);
    		}
    	}
    }
    
    bool flag[N];int dis[N];
    void Bfs()
    {
    	q.push(s);dis[s]=0;
    	while(!q.empty())
    	{
    		int k=q.front();q.pop();
    		if(flag[k]) continue;
    		int sz=to[k].size();
    		for(int i=0;i<sz;i++)
    		{
    			int kk=to[k][i];
    			if(dis[kk]==-1)
    			{
    				dis[kk]=dis[k]+1;
    				q.push(kk);
    				if(kk==t){printf("%d",dis[t]);exit(0);}
    			}
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++)
    	{
    		int x,y;scanf("%d%d",&x,&y);
    		to[x].push_back(y);
    		from[y].push_back(x);
    	}
    	scanf("%d%d",&s,&t);
    	bfs(t);
    	for(int i=1;i<=n;i++)
    	{
    		if(f[i]) continue;
    		flag[i]=1;
    		int sz=from[i].size();
    		for(int j=0;j<sz;j++) flag[from[i][j]]=1;
    	}
    	if(!f[s]) {printf("-1");return 0;}
    	memset(dis,-1,sizeof(dis));
    	Bfs();
    	return 0;
    }
  • 相关阅读:
    linux启动流程
    树-二叉平衡树AVL
    算法导论第六章 堆排序
    算法导论基础(第一~五章)
    树-二叉查找树
    Java:基础
    【转】为什么C++编译器不能支持对模板的分离式编译
    压缩和解压缩命令
    Makefile编程
    1.什么是Mybatis?
  • 原文地址:https://www.cnblogs.com/XYZinc/p/7573934.html
Copyright © 2011-2022 走看看