zoukankan      html  css  js  c++  java
  • The Unique MST POJ

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const int N=510,M=10010;
    int n,m;
    struct Edge
    {
        int a,b,w;
        bool f;
    } edge[M];
    int dist1[N][N], dist2[N][N];
    int h[N], e[N*2],w[N*2],ne[N*2],idx;
    int p[N];
    void add(int a,int b,int c)
    {
        e[idx]=b;
        w[idx]=c;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    int find(int x)
    {
        if(p[x]!=x)
            p[x]=find(p[x]);
        return p[x];
    }
    bool cmp(Edge a,Edge b)
    {
        return a.w<b.w;
    }
    void dfs(int u,int fa,int maxd1,int maxd2,int d1[],int d2[])
    {
        d1[u]=maxd1,d2[u]=maxd2;
        for(int i=h[u]; ~i; i=ne[i])
        {
            int j=e[i];
            if(j!=fa)
            {
                int td1=maxd1,td2=maxd2;
                if(w[i]>td1)
                    td2=td1,td1=w[i];
                else if(w[i]<td1&&w[i]>td2)
                    td2=w[i];
                dfs(j,u,td1,td2,d1,d2);
            }
        }
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
    
            cin>>n>>m;
            memset(h,-1,sizeof h);
            for(int i=0; i<m; i++)
            {
                int a,b,w;
                cin>>a>>b>>w;
                edge[i]= {a,b,w};
            }
            sort(edge,edge+m,cmp);
            for(int i=1; i<=n; i++)
                p[i]=i;
            ll sum=0;
            for(int i=0; i<m; i++)
            {
                int a=edge[i].a;
                int b=edge[i].b;
                int w=edge[i].w;
                int pa=find(a);
                int pb=find(b);
                if(pa!=pb)
                {
                    p[pa]=pb;
                    sum+=w;
                    add(a,b,w);
                    add(b,a,w);
                    edge[i].f=true;
                }
            }
            for(int i=1; i<=n; i++)
                dfs(i,-1,0,0,dist1[i],dist2[i]);
            ll res=1e18;
            for(int i=0; i<m; i++)
                if(!edge[i].f)
                {
                    int a=edge[i].a;
                    int b=edge[i].b;
                    int w=edge[i].w;
                    ll t;
                    if(w>=dist1[a][b])
                        t=sum+w-dist1[a][b];
                    else if(w>dist2[a][b])
                        t=sum+w-dist2[a][b];
                    res=min(res,t);
                }
            if(res==sum)
                cout<<"Not Unique!"<<endl;
            else
                cout<<sum<<endl;
        }
        return 0;
    }
  • 相关阅读:
    地理大发现
    克里斯托弗·哥伦布
    2016. last day in office
    泰斯花粉阻隔剂 怎么使用
    ZT 螨虫知识2
    ZT 螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,
    expense KK [ɪkˋspɛns] DJ [iksˋpens]
    Windows 实战项目 001 文件扫描器 (01)
    017 系统内存信息 内存大小 空闲内存 5
    017 虚拟内存页面区块 4
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12240410.html
Copyright © 2011-2022 走看看