UESTC ACM 1529 并查集+贪心

来源:互联网 发布:新媒体运营软件 编辑:程序博客网 时间:2024/05/22 06:05

题目连接:http://acm.uestc.edu.cn/problem.php?pid=1529

这个题我先开始就联想到以前做过的UVA上面的一道题目:

求最大的最小边,但是那个题是利用floyd算法过的。面对这个题N=1000的挑战。所以floyd我试都没有试

 

后来冥思苦想,询问了下大牛的思路。发现原来此题还可以直接贪心。

思路之逼真。于是我按那个思路实现了以下,果断的1Y了

 

show下我的代码:

算法是离线的那种。。在线的不知道怎么设计,而且我的速度也不是很快,大概在500-600ms之间

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;struct node{int a;int b;int len;};int n,m;struct question{int a;int b;int len;int id;};question que[3005];node e[100005];int father[1005];bool ans[3005];bool cmp1(node a,node b){return a.len<b.len;}bool cmp2(question a,question b){return a.len<b.len;}int find(int p){if(father[p]==p)return p;return father[p]=find(father[p]);}void Union(int a,int b){int x,y;x=find(a);y=find(b);if(x!=y)father[x]=y;}int main(){int t,T,i,q,Q,s;scanf("%d",&T);for(t=1;t<=T;t++){scanf("%d%d",&n,&m);for(i=0;i<=n;i++)father[i]=i;for(i=1;i<=m;i++)scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].len);sort(e+1,e+1+m,cmp1);scanf("%d",&Q);for(q=1;q<=Q;q++){scanf("%d%d%d",&que[q].a,&que[q].b,&que[q].len);que[q].id=q;}sort(que+1,que+Q+1,cmp2);printf("Case #%d:\n",t);memset(ans,0,sizeof(ans));s=1;for(q=1;q<=Q;q++){for(i=s;i<=m;i++){if(que[q].len>=e[i].len)Union(e[i].a,e[i].b);else{s=i;break;}}if(find(que[q].a)==find(que[q].b))ans[que[q].id]=true;elseans[que[q].id]=false;}for(i=1;i<=Q;i++){if(ans[i])printf("YES\n");elseprintf("NO\n");}}return 0;}


 

原创粉丝点击