zoukankan      html  css  js  c++  java
  • poj1679次小生成树入门题

    次小生成树求法:例如求最小生成树用到了 1、2、4这三条边,总共5条边,那循环3次的时候,每次分别不用1、2、4求得最小生成树的MST,最小的MST即为次小生成树

    如下代码maxx即求最小生成树时求得的最大边

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=100+10,maxn=111117,inf=0x3f3f3f;
    
    int c[N][N],d[N],n;
    bool used[N][N];//the MST i to j max power
    int maxx[N][N];//the MST max power
    int pre[N];//before edge
    int prim()
    {
        bool vis[N];
        memset(vis,0,sizeof vis);
        memset(used,0,sizeof used);
        memset(maxx,0,sizeof maxx);
        for(int i=1;i<=n;i++)//the first time used 1
        {
            d[i]=c[1][i];
            pre[i]=1;
        }
        d[1]=0;
        pre[1]=0;
        vis[1]=1;
        int ans=0;
        for(int i=2;i<=n;i++)
        {
            int mind=inf,k;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j]&&mind>d[j])
                {
                    mind=d[j];//find the next point that have min value with now
                    k=j;
                }
            }
            if(mind==inf)return -1;//not found exit
            ans+=mind;
            vis[k]=1;
            used[k][pre[k]]=used[pre[k]][k]=1;
            for(int j=1;j<=n;j++)
            {
                if(vis[j])maxx[j][k]=maxx[k][j]=max(maxx[j][pre[k]],d[k]);
                if(!vis[j]&&d[j]>c[j][k])
                {
                    d[j]=c[j][k];
                    pre[j]=k;
                }
            }
        }
        return ans;
    }
    int smst(int mst)
    {
        int ans=inf;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                if(c[i][j]!=inf&&!used[i][j])
                    ans=min(ans,mst+c[i][j]-maxx[i][j]);
            }
        }
        if(ans==inf)return -1;
        return ans;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t,m;
        cin>>t;
        while(t--){
            cin>>n>>m;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(i==j)c[i][j]=0;
                    else c[i][j]=inf;
                }
            }
            for(int i=0;i<m;i++)
            {
                int x,y,z;
                cin>>x>>y>>z;
                c[x][y]=c[y][x]=z;
            }
            int ans=prim();
            if(ans==-1)cout<<"Not Unique!"<<endl;
            else
            {
                if(smst(ans)!=ans)cout<<ans<<endl;
                else cout<<"Not Unique!"<<endl;
            }
        }
        return 0;
    }
    SMST
  • 相关阅读:
    oracle11g dataguard部署指南
    扩展Oracle表空间
    ORACLE SQLloader详细语法
    Oracle Data Guard
    struts2学习(4)struts2核心知识III
    struts2学习(3)struts2核心知识II
    struts2学习(2)struts2核心知识
    struts2学习(1)struts2 helloWorld
    java单例模式等一些程序的写法....持续更新...
    峰Spring4学习(8)spring对事务的支持
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7121216.html
Copyright © 2011-2022 走看看