Cod sursa(job #805497)

Utilizator geniucosOncescu Costin geniucos Data 31 octombrie 2012 16:02:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.45 kb
/*#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int nod,j,fmin,flow,i,n,m,x1,y1,co,q[1004],t[1004],viz[1004],c[1004][1004],f[1004][1004];
vector < int > h[1003];
int min(int a,int b)
{
    if(a<b) return a;
    return b;
}
int bfs()
{
    int i,j,nod;
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    q[0]=q[1]=1;
    for(i=1;i<=q[0];i++)
        if(q[i]!=n)
        {
            for(j=0;j<h[q[i]].size();j++)
            {
                nod=h[q[i]][j];
                if(viz[nod]==0&&f[q[i]][nod]<c[q[i]][nod])
                {
                    q[0]++;
                    q[q[0]]=nod;
                    viz[nod]=1;
                    t[nod]=q[i];
                    if(nod==n) return 1;
                }
            }
        }
    return viz[n];
    //return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
    scanf("%d %d %d",&x1,&y1,&co);
    h[x1].push_back(y1);
    h[y1].push_back(x1);
    c[x1][y1]+=co;
}
for(flow=0;bfs();)
    for(j=0;j<h[n].size();j++)
    {
        nod=h[n][j];
        if(f[nod][n]<c[nod][n]&&viz[nod]==1)
        {
            t[n]=nod;
            fmin=(1<<30);
            for(i=n;i!=1;i=t[i])
                fmin=min(fmin,c[t[i]][i]-f[t[i]][i]);
            if(fmin!=0)
            {
                for(i=n;i!=1;i=t[i])
                {
                    f[t[i]][i]+=fmin;
                    f[i][t[i]]-=fmin;
                }
            }
            flow=flow+fmin;
        }
    }
printf("%d\n",flow);
return 0;
}*/
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int co,x1,y1,m,s,pi,pj,val,n,mini,i,j,c[1015][1015],f[1015][1015],viz[1015],q[1015],t[1015];
vector < int > h[1014];
int min(int a,int b)
{
    if(a<b) return a;
    return b;
}
int bfs(int st,int dr)
{
    int i,j,nod;
    memset(viz,0,sizeof(viz));
    viz[st]=1;
    q[0]=1;
    q[1]=st;
    for(i=1;i<=q[0];i++)
        if(q[i]!=dr)
        {
            for(j=0;j<h[q[i]].size();j++)
            {
                nod=h[q[i]][j];
                if(viz[nod]==0&&c[q[i]][nod]>f[q[i]][nod])
                {
                    q[0]++;
                    q[q[0]]=nod;
                    viz[nod]=1;
                    t[nod]=q[i];
                    if(nod==dr) return 1;
                }
            }
        }
    return viz[dr];
}
int detmax(int st,int dr)
{
    memset(f,0,sizeof(f));
    int i,j,flow,fmin,nod;
    for(flow=0;bfs(st,dr);)
        for(j=0;j<h[dr].size();j++)
        {
            nod=h[dr][j];
            if(viz[nod]==1&&f[nod][dr]<c[nod][dr])
            {
                fmin=(1<<30);
                t[dr]=nod;
                for(i=dr;i!=st;i=t[i])
                    fmin=min(fmin,c[t[i]][i]-f[t[i]][i]);
                if(fmin!=0)
                {
                    for(i=dr;i!=st;i=t[i])
                    {
                        f[t[i]][i]+=fmin;
                        f[i][t[i]]-=fmin;
                    }
                }
                flow=flow+fmin;
            }
        }
    return flow;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
    scanf("%d %d %d",&x1,&y1,&co);
    h[x1].push_back(y1);
    h[y1].push_back(x1);
    c[x1][y1]+=co;
}
printf("%d\n",detmax(1,n));
return 0;
}