ybtoj 11.13 S组 D. 道路与航线
题面
样例
样例输入1
4 6 1 4
2 3 0
1 2 1
3 4 1
4 3 0
2 1 1
1 3 1
样例输出1
3 5
样例2
去掉第一个c和第一个b。见选手附加文件。比完赛就没大数据了((((
解题思路
😅出题人良心,数据范围明明3*10^6,于是40分卡了一小时😅
方法一:二分答案,然后暴力bfs就好了
方法二:用vis[i]标记起点能不能到达 i
- 如果 s 能走到 i,i 能走到 j ,那么 s 也能走到 j
- 如果s 不能走到 i,i 能走到 j,但是不能保证后面加入边时 s 不能走到 i :将 i 和 j 连起来,下次连到 i 时,再做一个小bfs(i)
Code
方法一
#include <bits/stdc++.h>
#define N 3001000
using namespace std;
struct DT{
int to, next;
}a[N * 2];
int n, m, S, T, l, r, mid, ans;
int num, head[N], v[N], x[N], y[N], id[N];
queue<int> q;
void add(int x, int y) {
a[++ num] = (DT){
y, head[x] }, head[x] = num;
}
int check(int m) {
memset(head, 0, sizeof(head));
num = 0;
for(int i = 1; i <= m; i ++) {
add(x[i], y[i]);
if(!id[i]) add(y[i], x[i]);
}
memset(v, 0, sizeof(v)