并查集。。。。。
按左端点排序后,枚举每一段,更新如果以这一段的右端点为区间结束点的长度。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int x,y,l,r;
}c[3300];
bool cmp(node a,node b)
{
return a.l<b.l;
}
int f[1100];
void init()
{
for(int i=0;i<=1010;i++) f[i]=i;
}
int find(int x)
{
if(x==f[x]) return x;
return find(f[x]);
}
void merge(int x,int y)
{
int xx=find(x);
int yy=find(y);
f[xx]=yy;
}
int n,m;
int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++)
{
int a,b,cc,d;
scanf("%d%d%d%d",&a,&b,&cc,&d);
c[i].x=a;c[i].y=b;c[i].l=cc;c[i].r=d;
}
sort(c,c+m,cmp);
int ans=0;
for(int i=0;i<m;i++)
{
init();
for(int j=0;j<m;j++)
{
if(c[j].l>c[i].r) break;
if(c[j].r<c[i].r) continue;
merge(c[j].x,c[j].y);
if(find(1)==find(n))
{
ans=max(ans,c[i].r-c[j].l+1);
break;
}
}
}
if(!ans) puts("Nice work, Dima!");
else printf("%d\n",ans);
return 0;
}