WA #5 求调
查看原帖
WA #5 求调
246954
xj22yangyichen楼主2023/8/11 12:27
#include<queue>
#include<vector>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define N 5000001
#define inf 0x3f3f3f3f
using namespace std;

int read(){
	int ans = 0;
	char ch = getchar();
	while(!isdigit(ch)){
		ch = getchar();
	}
	while(isdigit(ch)){
		ans *= 10;
		ans += ch ^ 48;
		ch = getchar();
	}
	return ans;
}

int n, m, s, t, head[N], cnt, dis_s[N], dis_t[N], vis[N], ans;
struct edge{
	int to, next;
}e[N << 1];
void add(int u, int v){
	e[++cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt;
}
vector<int> vec[N];
queue<int> q;

int main(){
	int u, v;
	n = read(), m = read();
	for(int i = 1; i <= m; i++){
		u = read(), v = read();
		add(u, v), add(v, u);
	}
	s = read(), t = read();
	
	//第一遍BFS求每个点到大厅的距离 
	memset(dis_s, inf, sizeof(dis_s));
	q.push(s);
	vis[s] = 1;
	dis_s[s] = 0;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(int i = head[u]; i; i = e[i].next){
			int v = e[i].to;
			if(vis[v]) continue;
			q.push(v);
			vis[v] = 1;
			dis_s[v] = dis_s[u] + 1;
		}
	}
	
	//第二遍DFS求每个点到毒气泄露点的距离 
	memset(dis_t, inf, sizeof(dis_t));
	memset(vis, 0, sizeof(vis));
	q.push(t);
	vis[t] = 1;
	dis_t[t] = 0;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(int i = head[u]; i; i = e[i].next){
			int v = e[i].to;
			if(vis[v]) continue;
			q.push(v);
			vis[v] = 1;
			dis_t[v] = dis_t[u] + 1;
		}
	}
	
	//第三遍DFS求能安全回到大厅的前提下到达每个点的最晚時間 
	memset(vis, 0, sizeof(vis));
	vis[s] = 1;
	int up = 0;
	for(int i = head[s]; i; i = e[i].next){
		int v = e[i].to;
		if(dis_t[v] > n) continue;
		vec[dis_t[v]].emplace_back(v);
		if(up < dis_t[v]) up = dis_t[v];
		vis[v] = 1;
	}
	for(int i = up; i; i--){
		for(auto u : vec[i]){
			for(int j = head[u]; j; j = e[j].next){
				int v = e[j].to;
				if(vis[v]) continue;
				dis_t[v] = min(dis_t[v], dis_t[u] - 1);
				vec[dis_t[v]].emplace_back(v);
				vis[v] = 1;
			}
		}
	}
	
	//統計答案 
	for(int i = 1; i <= n; i++){
		if((vis[i] || dis_t[i] > n) && dis_s[i] < dis_t[i]){
			ans++;
		}
	}
	printf("%d", ans - 1);
	return 0;
}
2023/8/11 12:27
加载中...