玄关求调
查看原帖
玄关求调
1013837
Tiskan_H楼主2024/7/29 23:44

rt,不大会写第一个bfs

#include <bits/stdc++.h>
#define N 10010
#define M 200010
using namespace std;

int tot,n,m,s,t;
int lin[N],dis[N],cb[N];
queue<int> q,bs;

struct edge{
	int to,nxt;
	bool z;
}e[2*M];

void bfs1(int from){
	int d=from;
	q.push(d);
	while(!q.empty()){
		d=q.front(); q.pop();
		//cout<<d<<" ";
		for(int i=lin[d];i;i=e[i].nxt)
			if(e[i].z==0&&dis[e[i].to]<cb[e[i].to]) 
				q.push(e[i].to),dis[e[i].to]+=1;
	}
}
int bfs2(int from){
	int d=from,b=0;
	dis[d]=1;
	q.push(d),bs.push(0);
	while(!q.empty()){
		d=q.front(); 
		b=bs.front();
		//cout<<d<<" "<<b<<endl;
		bs.pop(),q.pop();
		if(d==t)
			return b;
		for(int i=lin[d];i;i=e[i].nxt)
			if(e[i].z==1&&dis[e[i].to]==cb[e[i].to]) 
				q.push(e[i].to),bs.push(b+1);
	}
	return -1;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		if(x==y) continue;
		e[++tot]={y,lin[x],1},lin[x]=tot;
		e[++tot]={x,lin[y],0},lin[y]=tot;
		cb[x]+=1;
	}
	cin>>s>>t;
	
	bfs1(t);
	//cout<<endl;
	//for(int i=1;i<=n;i++) cout<<dis[i]<<" "; 
	if(dis[s]==cb[s]) cout<<bfs2(s);
	else cout<<-1;
	return 0;
}
2024/7/29 23:44
加载中...