zoukankan      html  css  js  c++  java
  • UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)

    题目大意:给一张无向图,求出最小树形图。

    题目分析:套朱-刘算法模板就行了。。。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    # define LL long long
    # define REP(i,s,n) for(int i=s;i<n;++i)
    # define CL(a,b) memset(a,b,sizeof(a))
    # define CLL(a,b,n) fill(a,a+n,b)
    
    const int N=1005;
    const int INF=1<<30;
    struct Edge
    {
        int fr,to,w;
    };
    Edge e[N*40];
    int vis[N],ID[N],pre[N],in[N],n,m;
    
    int zhu_liu(int root,int nv,int ne)
    {
        int res=0;
        while(1)
        {
            CLL(in,INF,nv);
            REP(i,0,ne) if(e[i].fr!=e[i].to&&in[e[i].to]>e[i].w){
                in[e[i].to]=e[i].w;
                pre[e[i].to]=e[i].fr;
            }
            in[root]=0;
            REP(i,0,nv) if(in[i]==INF) return -1;
            int nodeCnt=0;
            CL(ID,-1);
            CL(vis,-1);
            REP(i,0,nv){
                res+=in[i];
                int v=i;
                while(vis[v]!=i&&ID[v]==-1&&v!=root){
                    vis[v]=i;
                    v=pre[v];
                }
                if(v!=root&&ID[v]==-1){
                    for(int u=pre[v];u!=v;u=pre[u])
                        ID[u]=nodeCnt;
                    ID[v]=nodeCnt++;
                }
            }
            if(nodeCnt==0) break;
            REP(i,0,nv) if(ID[i]==-1) ID[i]=nodeCnt++;
            REP(i,0,ne){
                int v=e[i].to;
                e[i].fr=ID[e[i].fr];
                e[i].to=ID[e[i].to];
                if(e[i].fr!=e[i].to)
                    e[i].w-=in[v];
            }
            nv=nodeCnt;
            root=ID[root];
        }
        return res;
    }
    
    int main()
    {
        int T,cas=0;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            REP(i,0,m)
            {
                scanf("%d%d%d",&e[i].fr,&e[i].to,&e[i].w);
            }
            int ans=zhu_liu(0,n,m);
            printf("Case #%d: ",++cas);
            if(ans<0)
                printf("Possums!
    ");
            else
                printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    div 内容自动换行
    发邮件
    asp gridview
    授权 注册
    asp grid 增加和删除行数据
    计算两个日期相差的天数
    sql 删除数据库表 外键
    装完Centos7提示Initial setup of CentOS Linux 7 (core)(转载)
    如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
    centos7 安装拼音输入法(转载)
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4928353.html
Copyright © 2011-2022 走看看