Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

发一个短小精悍的递归版isap 效率还过得去 468ms

Posted by zengshiyuan at 2014-09-05 19:14:44 on Problem 2987
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int inf=100000000,maxinf=2000000000;
struct Edge{int u,v,c;};
Edge edge[150000];
int first[5510],nxt[150000],d[5510],num[5510],tot,s,t,node;
bool vis[5510];
void add(int u,int v,int c)
{
    edge[tot].u=u;
    edge[tot].v=v;
    edge[tot].c=c;
    nxt[tot]=first[u];
    first[u]=tot++;
}
int aug(int u,int res)
{
    if(u==t) return res;
    int flow=0,mindis=node;
    for(int i=first[u];i!=-1;i=nxt[i])
    {
        Edge &e=edge[i];
        if(e.c)
        {
            if(d[e.v]+1==d[u])
            {
                long long inc=aug(e.v,min(res-flow,e.c));
                e.c-=inc;
                edge[i^1].c+=inc;
                flow+=inc;
                if(flow==res) break;
                if(d[s]>=node) return flow;
            }
            if(d[e.v]<mindis)
                mindis=d[e.v];
        }
    }
    if(!flow)
    {
        if(!(--num[d[u]])) d[s]=node;
        num[d[u]=mindis+1]++;
    }
    return flow;
}
long long maxflow()
{
    long long sumflow=0;
    for(int i=0;i<=node;i++)
        d[i]=num[i]=0;
    num[0]=node;
    while(d[s]<node)
        sumflow+=aug(s,maxinf);
    return sumflow;
}
int cnt;
void dfs(int u)
{
    vis[u]=1;
    for(int i=first[u];i!=-1;i=nxt[i])
    {
        int v=edge[i].v;
        if(!vis[v] && edge[i].c)
            dfs(v),cnt++;;
    }
}
int main()
{
    int n,m,u,v,k;
    long long ans;
    while(scanf("%d%d",&n,&m)!=-1)
    {
        memset(first,-1,sizeof(first));
        tot=0;
        ans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&k);
            if(k>0)
                add(0,i,k),add(i,0,0),ans+=k;
            else if(k<0)
                add(i,n+1,-k),add(n+1,i,0);
        }
        while(m--)
        {
            scanf("%d%d",&u,&v);
            add(u,v,inf);
            add(v,u,0);
        }
        s=0,t=n+1,node=n+2;
        ans-=maxflow();
        cnt=0;
        memset(vis,0,sizeof(vis));
        dfs(0);
        printf("%d %lld\n",cnt,ans);
    }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator