zoukankan      html  css  js  c++  java
  • CF F. Royal Questions kruskal

    每一个 $A$ 必须和指定的唯一的 $B$ 匹配,转化成图论关系就是 $A$ 和 $B$ 之间有若干条连边,每个边有一个边权,而该边权只能代表一对 $A,B$.
    这其实就是一个基环树的结构.
    所以只需跑一个最大基环生成树森林即可. 

    #include<bits/stdc++.h> 
    #define ll long long  
    #define maxn 200004 
    using namespace std;  
    void setIO(string s) {
        string in=s+".in"; 
        freopen(in.c_str(),"r",stdin); 
    }
    int n,m;   
    int p[maxn],tag[maxn]; 
    void init() {
        for(int i=0;i<maxn;++i) p[i]=i;  
    } 
    int find(int x) {
        return p[x]==x?x:p[x]=find(p[x]);  
    }
    struct Edge { 
        int u,v,c; 
    }ed[maxn];         
    bool cmp(Edge a,Edge b) {
        return a.c>b.c; 
    }
    int main() {
        // setIO("input");  
        init(); 
        scanf("%d%d",&n,&m);   
        for(int i=1;i<=m;++i) scanf("%d%d%d",&ed[i].u,&ed[i].v,&ed[i].c);   
        sort(ed+1,ed+1+m,cmp);  
        ll ans=0; 
        for(int i=1;i<=m;++i) {
            int a=find(ed[i].u), b=find(ed[i].v);       
            if(a!=b&&(!tag[a]||!tag[b])) ans+=1ll*ed[i].c, tag[a]|=tag[b], p[b]=a; 
            else if(a==b && !tag[a]) ans+=1ll*ed[i].c, tag[a]=1;         
        }   
        printf("%I64d
    ",ans); 
        return 0; 
    }
    

      

  • 相关阅读:
    无符合条件的记录,SUM函数返回NULL。返回0而不是Null
    Java中的堆栈,队列,链表
    Java集合类的问题
    2014.7.30日结
    我的CSS之路1
    2014.7.27-7.28日结
    LeetCode解题源代码链接集锦一
    2014.7.23日结
    C++之数组声明与初始化
    系统结构之指令
  • 原文地址:https://www.cnblogs.com/guangheli/p/11263392.html
Copyright © 2011-2022 走看看