题目地址:点击打开链接
题意:给你一个图,每条边有一个[L, R],只有在这个区间内的点才能通过,问满足能从1
到n的最大连续区间的长度为多少
思路:
二分思路:枚举下界,二分上界,dfs是否能到。
搜索思路:
剪枝1.如果到过该点,并且此时的左右边界比原先的小,剪枝;
剪枝2:如果当前左右边界范围的值比之前搜到的答案还小,剪枝;
二分代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+5;
struct node
{
int v, l, r;
node(){}
node(int vv, int ll, int rr): v(vv), l(ll), r(rr) {}
};
int L[maxn], R[maxn], n, m;
bool vis[maxn];
vector<node> g[maxn];
bool dfs(int u, int l, int r)
{
if(l > r) return 0;
if(u == n) return 1;
for(int i = 0; i < g[u].size(); i++)
{
int v = g[u][i].v;
int vl = g[u][i].l;
int vr = g[u][i].r;
if(vl <= l && vr >= r && !vis[v])
{
vis[v] = 1;
if(dfs(v, l, r)) return 1;
}
}
return 0;
}
int main(void)
{
while(cin >> n >> m)
{
for(int i = 1; i <= n; i++)
g[i].clear();
for(int i = 1; i <= m; i++)
{
int u, v, l, r;
scanf("%d%d%d%d", &u, &v, &l, &r);
g[u].push_back(node(v, l, r));
g[v].push_back(node(u, l, r));
L[i] = l;
R[i] = r;
}
sort(L+1, L+1+m);
sort(R+1, R+1+m);
int ans = 0;
for(int i = 1; i <= m; i++)
{
int l = 1, r = m;
while(l <= r)
{
memset(vis, 0, sizeof(vis));
int mid = (l+r)/2;
if(dfs(1, L[i], R[mid]))
{
ans = max(ans, R[mid]-L[i]+1);
l = mid+1;
}
else r = mid-1;
}
}
if(!ans) puts("Nice work, Dima!");
else printf("%d\n", ans);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
struct node
{
int v, l, r;
node(int vv, int ll, int rr): v(vv), l(ll), r(rr) {}
};
int n, m, ans, recl[maxn], recr[maxn];
bool vis[maxn], book[maxn];
vector<node> g[maxn];
void dfs(int u, int l, int r)
{
if(u == n)
{
ans = max(ans, r-l+1);
retur