• 题解 P2296 【寻找道路】


    在有向图 GG 中,每条边的长度均为 11,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

    1. 路径上的所有点的出边所指向的点都直接或间接与终点连通。
    2. 在满足条件 11 的情况下使路径最短。

    注意:图 GG 中可能存在重边和自环,题目保证终点没有出边。

    请你输出符合条件的路径的长度。

    这道题,我们考虑哪些点能够到达终点,问题等价于:反向建边后,终点能到达哪些点。

    void dfs(int x){
    	h[x]=true;
    	for(auto i:E[x])
    		if(!h[i])dfs(i);
    }
    

    EE 正是反向建边后的边集。

    hx=1h_x=1 就表示 xx 号点能到终点。

    所以,我们可以判断哪些点可以走了。

    能经过的点要满足 22 个条件:

    1. 它自己能到达终点
    2. 它的出边所指向的点都能达到终点
    for(int i=1;i<=n;i++)
    	if(h[i]){
    		dis[i]=true;
    		for(auto j:v[i])
    			if(!h[j]){dis[i]=false;break;}
    	}
    

    这部做完了,就可以开始 bfsbfs 了。

    边权全都是 11 自然是第 11 次搜到的就是最优解。

    q.push((node){s,0});
    while(q.size()){
    	node x=q.front();
    	if(x.x==t){
    		cout<<x.s;
    		return 0;
    	}
    	for(auto i:v[x.x])
    		if(dis[i]&&!vis[i]){
    			vis[i]=true;
    			q.push((node){i,x.s+1});
    		}
    	q.pop();
    }cout<<-1;
    

    还是很简单的。

    总代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    template<typename T>inline void read(T &FF){
    	T RR=1;FF=0;char CH=getchar();
    	for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
    	for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
    	FF*=RR;
    }
    struct node{
    	int x,s;
    };
    bool h[10010],vis[10010];
    int n,m,dis[10010],s,t;
    vector<int>v[10010];
    vector<int>E[10010];
    queue<node>q;
    void dfs(int x){
    	h[x]=true;
    	for(auto i:E[x])
    		if(!h[i])dfs(i);
    }
    int main(){
    	read(n);read(m);
    	for(int i=1;i<=m;i++){
    		int x,y;read(x);read(y);
    		v[x].push_back(y);
    		E[y].push_back(x);
    	}
    	read(s);read(t);
    	dfs(t);
    	for(int i=1;i<=n;i++)
    		if(h[i]){
    			dis[i]=true;
    			for(auto j:v[i])
    				if(!h[j]){dis[i]=false;break;}
    		}
    	q.push((node){s,0});
    	while(q.size()){
    		node x=q.front();
    		if(x.x==t){
    			cout<<x.s;
    			return 0;
    		}
    		for(auto i:v[x.x])
    			if(dis[i]&&!vis[i]){
    				vis[i]=true;
    				q.push((node){i,x.s+1});
    			}
    		q.pop();
    	}cout<<-1;
    	return 0;
    }
    
  • 相关阅读:
    素材收集
    网站返回503
    uva 1048 最短路的建图 (巧,精品)
    hdu5188 01 背包
    hdu 5187 快速幂 + 快速乘 值得学习
    差分约束
    uva11090 Bellman-Ford 运用
    hdu 5185 动态规划 分析降低复杂度
    hdu5184 数论证明
    HDU5183 hash 表
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12968776.html
Copyright © 2020-2023  润新知