博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HAOI2006】旅行(并查集暴力)
阅读量:4562 次
发布时间:2019-06-08

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

Solution:

并查集暴力搞。

挺像kruskal找最小生成树的,按边权从小到大排序,枚举最小边,然后不停的加比这条边大的边,直到s,t连通。

#include
#define N 505#define M 5005using namespace std;int n,m,s,t,father[N];struct node{ int from,to,val;}edge[2*M];inline bool cmp(const node &a,const node &b){ return a.val
x) return gcd(y,x); if(!y) return x; return gcd(y,x%y);}int main(){ ios::sync_with_stdio(false); cin.tie(NULL),cout.tie(NULL); cin>>n>>m; for(int i=1;i<=m;i++) { int x,y,z; cin>>x>>y>>z; edge[i].to=y; edge[i].from=x; edge[i].val=z; } cin>>s>>t; sort(edge+1,edge+m+1,cmp); int ans_max,ans_min; for(int i=1;i<=m;i++) { int j; for(j=1;j<=n;j++) father[j]=j; for(j=i;j<=m;j++) { int ax=getfather(edge[j].from); int bx=getfather(edge[j].to); if(ax!=bx) { father[ax]=bx; if(getfather(s)==getfather(t)) break; } } if(i==1&&getfather(s)!=getfather(t)) { cout<<"IMPOSSIBLE"<
=ans_min*edge[j].val){//只是移一下项 ans_max=edge[j].val; ans_min=edge[i].val; } } int a=gcd(ans_max,ans_min); if(a==ans_min) cout<

转载于:https://www.cnblogs.com/Patrickpwq/articles/9446294.html

你可能感兴趣的文章
HTML fieldset和legend标签
查看>>
Shell成长之路
查看>>
使用kmeans聚类观察京东物流优化挑战赛的数据
查看>>
同一天有重复请假
查看>>
POJ 1410 Intersection --几何,线段相交
查看>>
第一册:lesson eighty one.
查看>>
html5+js+.Net的即时多人聊天
查看>>
NSArray
查看>>
理论制作 Windows 开机动画
查看>>
Lucene4.9学习笔记——Lucene建立索引
查看>>
安卓备份 To Do(待办事项)的数据库
查看>>
vim下正则表达式的非贪婪匹配
查看>>
一个python的计算熵(entropy)的函数
查看>>
spring源码学习——spring整体架构和设计理念
查看>>
模拟window系统的“回收站”
查看>>
OpenCV中的split函数
查看>>
session共享
查看>>
MongoDB divide 使用之mongotempalte divide
查看>>
style不同取值对应的日期、时间格式
查看>>
三星S5_G9008V 解锁联通4G(安卓6.0)
查看>>