博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[并查集][暴力][二分] Jzoj P5177 TRAVEL
阅读量:4635 次
发布时间:2019-06-09

本文共 1369 字,大约阅读时间需要 4 分钟。

Description

 

Input

Output

 

Sample Input

4 41 2 1 102 4 3 51 3 1 52 4 2 7

Sample Output

62 3 4 5 6 7 

 

 

题解

  • 显然可以发现,答案的l和r一定是某条路径的l和r
  • 那么可以把r进行排序,然后二分l
  • 判断是否所有的边都符合,合法的用并查集连起来
  • 如果1和n在同一个并查集内,说明可以相互到达,那么就是合法的
  • 再考虑另一种做法,可以把r从大到小排序
  • 枚举l和r,然后来个最优性剪枝,如果当前枚举的l和r小于ans,直接break
  • 同样的可以用并查集维护,这样实测会快很多

代码

1 #include 
2 #include
3 #include
4 #define N 1010 5 #define M 3010 6 using namespace std; 7 struct edge {
int x,y,l,r;}a[M]; 8 int n,m,ans,num,fa[N]; 9 bool cmp(edge a,edge b) { return a.r>b.r; }10 int getfather(int x) { return fa[x]==x?x:fa[x]=getfather(fa[x]); }11 int main()12 {13 scanf("%d%d",&n,&m);14 for (int i=1;i<=m;i++) scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].l,&a[i].r);15 sort(a+1,a+m+1,cmp);16 for (int i=1;i<=m;i++)17 {18 for (int j=1;j<=n;j++) fa[j]=j;19 for (int j=1;j<=m;j++)20 if (a[j].l<=a[i].l)21 {22 int p=a[j].r-a[i].l+1;23 if (p
num)) break;24 int u=getfather(a[j].x),v=getfather(a[j].y);25 if (u!=v) fa[u]=v;26 if (getfather(1)==getfather(n)) { ans=p,num=a[i].l; break; }27 }28 }29 printf("%d\n",ans);30 for (int i=num;i<=num+ans-1;i++) printf("%d ",i);31 }

 

转载于:https://www.cnblogs.com/Comfortable/p/9843852.html

你可能感兴趣的文章
[转载] 晓说——第9期:多如牛毛严酷无比的美国那些法
查看>>
[转载] New Concept English 1——Lesson 7 Are you a teacher?
查看>>
as3调用外部swf里的类的方法
查看>>
如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
查看>>
任意阶幻方(魔方矩阵)C语言实现
查看>>
视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
查看>>
第五次作业
查看>>
织梦教程
查看>>
杭电多校 Harvest of Apples 莫队
查看>>
【文章】孝心无价 作者:毕淑敏
查看>>
mysql中的数据类型
查看>>
19-6/28作业:100以内偶数求和
查看>>
TKmybatis和mybatisplus哪个好用
查看>>
iframe 子父窗口互掉 js
查看>>
函数对象 函数嵌套 名称空间与作用域
查看>>
SSIS 包部署错误 0xC0010014
查看>>
java 第11次作业:你能看懂就说明你理解了——this关键字
查看>>
git 代理设置
查看>>
ORACLE查询表最近更改的数据
查看>>
如果我们不曾相遇
查看>>