zoukankan      html  css  js  c++  java
  • POJ:3371 Connect the Cities(最小生成树)

    AC代码:

    /**
    /*@author Victor
    /* C++
    */
    #include <bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<bitset>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<cmath>
    #include<list>
    #include<map>
    #include<set>
    //#define DEBUG
    #define RI register int
    using namespace std;
    typedef long long ll;
    //typedef __int128 lll;
    const int N=100000+10;
    const int MOD=1e9+7;
    const double PI = acos(-1.0);
    const double EXP = 1E-8;
    const int INF = 0x3f3f3f3f;
    
    const int maxn=500+10;
    struct Edge
    {
        int from,to,dist;
        Edge(int f,int t,int d):from(f),to(t),dist(d) {}
        bool operator <(const Edge& a)
        {
            return dist<a.dist;
        }
    };
    vector<Edge>edges;
    int pre[maxn],T[maxn];
    //并查集
    int find(int x)
    {
        int i=x;
        while(pre[i]!=i)
            i=pre[i];
        int j=x,k;
        while(j!=pre[j])
        {
            k=pre[j];
            pre[j]=i;
            j=k;
        }
        return i;
    }
    void joint(int x,int y)
    {
        if(find(x)!=find(y))
            pre[find(x)]=find(y);
    }
    int kruskal()
    {
        int sum=0;
        sort(edges.begin(),edges.end());
        for(int i=0; i<edges.size(); i++)
        {
            int x=find(edges[i].from),y=find(edges[i].to);
            if(x!=y)
            {
                sum+=edges[i].dist;
                pre[x]=y;
            }
        }
        return sum;
    }
    int main()
    {
        int n,m,k,Case;
        scanf("%d",&Case);
        while(Case--)
        {
            scanf("%d%d%d",&n,&m,&k);
            for(int i=1; i<=n; i++)
                pre[i]=i;
            edges.clear();
            for(int i=0; i<m; i++)
            {
                int f,t,d;
                scanf("%d%d%d",&f,&t,&d);
                edges.push_back(Edge(f,t,d));
            }
            for(int i=0; i<k; i++)
            {
                int t;
                scanf("%d",&t);
                for(int j=0; j<t; j++)
                    scanf("%d",&T[j]);
                for(int j=1; j<t; j++)
                    joint(T[0],T[j]);
            }
            int ans=kruskal();
            //通过并查集判断是否联通
            bool mark=true;
            for(int i=2; i<=n; i++)
                if(find(1)!=find(i))
                {
                    mark=false;
                    break;
                }
            if(mark==true)
                printf("%d
    ",ans);
            else
                printf("-1
    ");
        }
        return 0;
    }

     最小生成树模板

    /*
    Kruskal 基本模板*/
    #include<bits/stdc++.h> 
    using namespace std;
    const int maxn=1e3;
    struct Edge{
        int from,to,dist;
        Edge(int f,int t,int d):from(f),to(t),dist(d){}
        bool operator <(const Edge& a){
            return dist<a.dist;
        }
    };
    vector<Edge>edges;
    int pre[maxn];
    int find(int x){
        int i=x;
        while(pre[i]!=i)i=pre[i];
        int j=x,k;
        while(j!=pre[j]){
            k=pre[j];
            pre[j]=i;
            j=k;
        }
        return i;
    }
    void joint(int x,int y){
        if(find(x)!=find(y))pre[find(x)]=find(y);
    }
    int kruskal(){
        int sum=0;
        sort(edges.begin(),edges.end());
        for(int i=0;i<edges.size();i++){
            int x=find(edges[i].from),y=find(edges[i].to);
            if(x!=y){
                sum+=edges[i].dist;
                pre[x]=y;
            }
        }
        return sum;
    }
    int main(){
        int v,e;
        while(~scanf("%d%d",&v,&e)){
            for(int i=0;i<=v;i++)pre[i]=i;
            edges.clear();
            for(int i=0;i<e;i++){
                int f,t,d;
                scanf("%d%d%d",&f,&t,&d);
                edges.push_back(Edge(f,t,d));
            }
            int ans=kruskal();
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    django QQ认证登录
    python mixin到底是什么 django
    Django View类的解析
    [置顶] 十道海量数据处理面试题
    Epoll简介以及例子
    GCC在C语言中内嵌汇编 asm __volatile__
    在FireBug中计算Javascript 运行时间
    Two Sum
    Longest Consecutive Sequence
    Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/DWVictor/p/10274632.html
Copyright © 2011-2022 走看看