寻找道路


题解:

考试的时候的思路是,找出哪些点与终点不连通,用一个bool数组保存下来,在遍历图的时候
就可以快速判断某条路径是否合理,而且时间复杂度也合乎情理。
我一开始用vector建了一个正图,一个反图。用反图从终点往前递归初始化link数组,然后
再用DFS遍历图,如果下一个点连接了一个没有连接到终点的点,那么我们就舍弃这个点
而进入下一个点。DFS完成后我们就取得了答案,如果link[起点] = 0或者是Ans仍然等于INF则是无解
但是这样做只得了10分,后面直接报MLE
后来找到原因,在遍历反图时,因为用的是递归查询,当边比较多时就爆栈了
那么我们就用BFS吧  基本思路不变  只是将DFS改为BFS
另外我们还可以再更新一下link数组,如果一个点没有连接到终点,那么和它相连的其他点也不能选
注意这个更新过程我们要用另一个数组保存它原始的状态,否则就有后效性了

用d保存最短路距离,从终点开始BFS,最后答案为d[start]

代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<stack>
#include<climits>
#include<queue>
#define MAXA 10005
using namespace std;
vector<int> ast[MAXA];
queue<int> Q;
int n,m,s,t,u,v,Ans = 0x3f3f3f3f,d[MAXA];
bool vis[MAXA],link[MAXA],Init_link[MAXA];
void BFS() {
	Q.push(t);
	while(!Q.empty()) {
		int now = Q.front();
		Q.pop();
		for(int i=0;i<ast[now].size();i++) {
			if(link[ast[now][i]]) {
				Q.push(ast[now][i]);
				link[ast[now][i]] = 0;
				d[ast[now][i]] = d[now] + 1;
			}
		}
	}
	
}
void FindAst(int x) {
	Q.push(t);
	while(!Q.empty()) {
		int now = Q.front();
		Q.pop();
		for(int i=0;i<ast[now].size();i++) {
			if(!Init_link[ast[now][i]]) {
				Init_link[ast[now][i]] = 1;
				Q.push(ast[now][i]);
			}
		}
	}
}
int main() {
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++) {
		scanf("%d %d",&u,&v);
		if(u == v)
		   continue;
		ast[v].push_back(u);
	}
	scanf("%d %d",&s,&t);
	
	FindAst(t);
	Init_link[t] = 1;
	
	for(int i=1;i<=n;i++)
	    link[i] = Init_link[i];
	    
	for(int i=1;i<=n;i++)
	    if(!Init_link[i])
	       for(int j=0;j<ast[i].size();j++)
	           if(link[ast[i][j]])
	              link[ast[i][j]] = 0;
	
	BFS();
	
	if(d[s] == 0)
	   printf("-1");
    else printf("%d",d[s]);
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值