题目
解题思路:
枚举
l
l
l,用spfa求出最大的
r
r
r
我们发现会超时
又发现
l
l
l一定是某一条边得
l
l
l
所以我们将所有边按照l排序
再枚举所有
l
l
l,枚举同事求出
r
r
r判断是否是最优解
Accepted code:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1005
#define M 10050
using namespace std;
const int inf = 1e9;
struct node {
int to, l, r, next;
}e[M];
int n, m, L, R, f[N], last[N], tot, cnt, l[M];
bool v[N];
inline int read() {
int f = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) f = (f<<1) + (f<<3) + c - 48, c = getchar();
return f;
}
inline void add() {
int x = read(), y = read(), l_ = read(), r_ = read();
e[++cnt] = (node){y, l_, r_, last[x]}; last[x] = cnt;
e[++cnt] = (node){x, l_, r_, last[y]}; last[y] = cnt;
}
int SPFA(int L)
{
memset(f, 0, sizeof(f)); queue <int> q;
q.push(1); f[1] = inf; v[1] = true;
while(!q.empty()) {
int x = q.front(); q.pop(); v[x] = 0;
for(int i = last[x]; i; i = e[i].next) {
int y=e[i].to;
if(e[i].l <= L && e[i].r >= L &&
min(e[i].r, f[x]) > f[y]) {
f[y] = min(e[i].r,f[x]);
if(!v[y]) {
v[y] = 1;
q.push(y);
}
}
}
}
return f[n];
}
signed main() {
memset(last, 0, sizeof(last));
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
add();
l[i] = e[cnt].l;
}
sort(l+1, l+m+1);
int len = unique(l+1, l+m+1)-l-1;
for (int i = 1; i <= len; i++) {
int k = l[i], r = SPFA(l[i]);
if (r-k+1 > R-L+1) {
R = r;
L = k;
}
}
printf("%d\n", R - L + 1);
for (int i = L; i <= R; i++)
printf("%d ", i);
}