10.24 TRAVEL

26 篇文章 0 订阅
15 篇文章 0 订阅

题目

解题思路:

枚举 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值