• UVA-10600(次小生成树)


    题意:

    现在给一个图,问最小生成树和次小生成树的权值和是多少;

    思路:

    求最小生成树的两种方法,次小生成树是交换最小生成树的其中一条边得到的,现在得到了最小生成树,枚举不在次小生成树中的边,再求一边最小生成树,这些最小生成树的最小权值就是次小生成树的权值了;

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    
    using namespace std;
    
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    
    typedef  long long LL;
    
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
    
    const LL mod=1e9+7;
    const double PI=acos(-1.0);
    const int inf=1e9;
    const int N=15e4+10;
    const int maxn=1e2+10;
    const double eps=1e-5;
    
    int mp[maxn][maxn],vis[maxn],n,m,fa[maxn],ans1,ans2;
    int prim()
    {
        int lowcost[maxn],sum=0;
        mst(vis,0);
        vis[1]=1;
        For(i,2,n)lowcost[i]=mp[1][i],fa[i]=1;
        For(i,1,n)
        {
            int temp=inf,k;
            For(j,1,n)
            {
                if(!vis[j]&&lowcost[j]<temp)
                {
                    temp=lowcost[j];
                    k=j;
                }
            }
            if(temp==inf)break;
            sum+=temp;
            vis[k]=1;
            For(j,1,n)
                if(!vis[j]&&mp[k][j]<lowcost[j])lowcost[j]=mp[k][j],fa[j]=k;
        }
        return sum;
    }
    int secondprim()
    {
        int sum=inf,father[maxn];
        For(i,2,n)father[i]=fa[i];
        For(i,2,n)
        {
            int x=father[i];
            int temp=mp[x][i];
            mp[x][i]=mp[i][x]=inf;
            int y=prim();
            if(y>=ans1)sum=min(sum,y);
            mp[x][i]=mp[i][x]=temp;
        }
        return sum;
    }
    int main()
    {
    	//freopen("in.txt","r",stdin);
            int t ;
            read(t);
            while(t--)
            {
                read(n);read(m);
                For(i,1,n)For(j,1,n)mp[i][j]=inf;
                int u,v,w;
                For(i,1,m)
                {
                    read(u);read(v);read(w);
                    mp[u][v]=mp[v][u]=w;
                }
                ans1=prim();
                ans2=secondprim();
                printf("%d %d
    ",ans1,ans2);
            }
            return 0;
    }
    

      

  • 相关阅读:
    C语言实现奇偶交换_艾孜尔江撰
    图形学变换中的Homogenize方法_艾孜尔江撰
    解决VS Code中字符乱码的情况_艾孜尔江撰
    C++中设置Main函数结束后执行的代码_艾孜尔江撰
    SVN常用命令集合_艾孜尔江撰
    双指旋转操作的核心
    go写一个简单的HTTP服务器
    MD5加密算法
    C++撰写的简易图书管理系统
    Windows系统cmd中运行ssh命令显示不是内部或外部命令,也不是可运行的程序
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5684986.html
Copyright © 2020-2023  润新知