The Unique MST POJ - 1679 次小生成树

Posted qingyuyyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Unique MST POJ - 1679 次小生成树相关的知识,希望对你有一定的参考价值。

#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;
}

 

以上是关于The Unique MST POJ - 1679 次小生成树的主要内容,如果未能解决你的问题,请参考以下文章

[2016-01-27][POJ][1679][The Unique MST]

POJ 1679 The Unique MST

POJ——T1679 The Unique MST

POJ1679 The Unique MST —— 次小生成树

POJ-1679 The Unique MST---判断最小生成树是否唯一

POJ1679 The Unique MST