• HDU 1853


    http://acm.hdu.edu.cn/showproblem.php?pid=1853

    和下题一模一样,求一个图环的并,此题的题干说的非常之裸露

    http://www.cnblogs.com/xiaohongmao/p/3873957.html

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std ;
    const int INF=0xfffffff ;
    struct node{
        int s,t,cap,cost,nxt ;
    }e[200005] ;
    int sumflow ;
    int n,m,cnt,head[10005],vis[10005],dis[10005],pre[10005] ;
    void add(int s,int t,int cap,int cost)
    {
        e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
        e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap=0 ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
    }
    int spfa(int s,int t,int N)
    {
        for(int i=0 ;i<=N ;i++)
            dis[i]=INF ;
        dis[s]=0 ;
        memset(vis,0,sizeof(vis)) ;
        memset(pre,-1,sizeof(pre)) ;
        vis[s]=1 ;
        queue <int> q ;
        q.push(s) ;
        while(!q.empty())
        {
            int u=q.front() ;
            q.pop() ;
            vis[u]=0 ;
            for(int i=head[u] ;i!=-1 ;i=e[i].nxt)
            {
                int tt=e[i].t ;
                if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
                {
                    dis[tt]=dis[u]+e[i].cost ;
                    pre[tt]=i ;
                    if(!vis[tt])
                    {
                        vis[tt]=1 ;
                        q.push(tt) ;
                    }
                }
            }
        }
        if(dis[t]==INF)return 0 ;
        return 1 ;
    }
    int MCMF(int s,int t,int N)
    {
        int flow,minflow,mincost ;
        mincost=flow=0 ;
        while(spfa(s,t,N))                                                
        {
            minflow=INF ;
            for(int i=pre[t] ;i!=-1 ;i=pre[e[i].s])
                minflow=min(minflow,e[i].cap) ;
            flow+=minflow ;
            for(int i=pre[t] ;i!=-1 ;i=pre[e[i].s])
            {
                e[i].cap-=minflow ;
                e[i^1].cap+=minflow ;
            }
            mincost+=dis[t]*minflow ;
        }
        sumflow=flow ;//最大流 
        return mincost ;
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            cnt=0 ;
            memset(head,-1,sizeof(head)) ;
            int S=0 ;
            int T=2*n+1 ;
            for(int i=0 ;i<m ;i++)
            {
                int s,t,v ;
                scanf("%d%d%d",&s,&t,&v) ;
                add(s,t+n,1,v) ;
            }
            for(int i=1 ;i<=n ;i++)
                add(S,i,1,0) ;
            for(int i=n+1 ;i<=2*n ;i++)
                add(i,T,1,0) ;
            int ans=MCMF(S,T,T+1) ;
            if(sumflow!=n)puts("-1") ;
            else printf("%d
    ",ans) ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3874105.html
Copyright © 2020-2023  润新知