国王的烦恼

来源:互联网 发布:java log4j mongodb 编辑:程序博客网 时间:2024/05/16 01:56

即便之前知道这题是并查集,而且自己还觉得并查集学的不错,还是没做出来。还以为是带权的,搞了半天。确实很有趣

思路:

对于此题,只需要从天数大到小判断,并连接图中节点,判断是否在某条边时,连接了两个不同的连通分支,并且在一天最多答案+1。

第一次做到排序+并查集。一直以为并查集对于顺序毫无关系


#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <iostream>#include <vector>using namespace std;const int maxn=10005;typedef long long int ll;int father[maxn];int relation[maxn];int m,n;struct node{    int u,v,w;}a[maxn*10];int find(int x){    if(father[x]!=x)          father[x]=find(father[x]) ;    return father[x];}bool Union(int x,int y){    int rootx=find(x);    int rooty=find(y);    if(rootx!=rooty)    {        father[rooty]=rootx;        return true;    }    else    {        return false;    }}int cmp(node x,node y){    return x.w>y.w;}int main(){    cin>>n>>m;    for(int i=1;i<=n;i++)    {         father[i]=i;    }    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);        }    int ans=0;    sort(a+1,a+1+m,cmp);    int pos=-1;    for(int i=1;i<=m;i++)    {        if(Union(a[i].u,a[i].v))        {            if(a[i].w!=pos)                ans++,pos=a[i].w;        }    }    cout<<ans<<endl;}

0 0
原创粉丝点击