• UVA 11183 Teen Girl Squad 最小树形图


    最小树形图模板题

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <vector>
    using namespace std;
    typedef long long LL;
    const int N=1e3+5;
    const int INF=0x3f3f3f3f;
    struct Node{
      int x,y;
    }p[N];
    struct Edge{
        int u,v,w;
    }edge[N*40];
    int in[N];
    int id[N],vis[N],pre[N],n,m;
    int zhuliu(int rt,int n,int m){
         int ret=0;
         while(1){
         for(int i=1;i<=n;++i)in[i]=INF;
         for(int i=1;i<=m;++i){
            if(edge[i].u!=edge[i].v&&edge[i].w<in[edge[i].v]){
                pre[edge[i].v]=edge[i].u;
                in[edge[i].v]=edge[i].w;
            }
         }
         for(int i=1;i<=n;++i)
         if(i!=rt&&in[i]==INF)return -1;
         int cnt=0;
         memset(id,-1,sizeof(id));
         memset(vis,-1,sizeof(vis));
         in[rt]=0;
         for(int i=1;i<=n;++i){
            ret+=in[i];
            int v=i;
            while(vis[v]!=i&&id[v]==-1&&v!=rt){
                vis[v]=i;
                v=pre[v];
            }
            if(v!=rt&&id[v]==-1){
                ++cnt;
                for(int u=pre[v];u!=v;u=pre[u])
                  id[u]=cnt;
                id[v]=cnt;
            }
         }
         if(cnt==0)break;
         for(int i=1;i<=n;++i)
         if(id[i]==-1)id[i]=++cnt;
         for(int i=1;i<=m;++i){
            int u=edge[i].u,v=edge[i].v;
            edge[i].u=id[u];
            edge[i].v=id[v];
            if(id[u]!=id[v])edge[i].w-=in[v];
         }
         n=cnt;
         rt=id[rt];
         }
         return ret;   
    }
    int main()
    {
        int T,cas=0;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&m);
            for(int i=1;i<=m;++i){
              scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
              ++edge[i].u,++edge[i].v;
            }
            printf("Case #%d: ",++cas);
            int ans=zhuliu(1,n,m);
            if(ans==-1)printf("Possums!
    ");
            else printf("%d
    ",ans);    
        }
        return 0;
    }
    View Code
  • 相关阅读:
    数组下标索引的循环原来可以这样写
    移位运算>>与>>>
    java调用redis的多种方式与心得
    $.ajax传输js数组,spring接收异常
    div背景css样式笔记
    js监听网页页面滑动滚动事件,实现导航栏自动显示或隐藏
    设置系统时区
    安装与配置文本编辑器vim
    添加阿里云数据源
    spring controller获取web前端post数据乱码解决
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5479443.html
Copyright © 2020-2023  润新知