Cod sursa(job #554576)

Utilizator c_adelinaCristescu Adelina c_adelina Data 14 martie 2011 22:49:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.17 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#include <string>
#define N 1001
int cap[N][N];
struct nod { int x; nod *n;};
nod *a[N];
int n, m;
int t[N];
inline int bfs()
{
            int Q[N], p=0, q=0;
            bool use[N];
            int d[N];
            memset(use, 0, sizeof(use));
            memset(t, 0, sizeof(t));
            memset(d, 0, sizeof(d));
            use[1]=1;
            Q[0]=1;
            
            while(p<=q)
            {
                        int u=Q[p++];
                        
                        for(nod *i=a[u]; i; i=i->n)
                                    if(!use[i->x])
                                                if(cap[u][i->x] > 0)
                                                {
                                                            Q[++q]=i->x;
                                                            use[i->x]=1;
                                                            t[i->x]=u;
                                                            d[i->x]=d[u] + 1;
                                                }
            }
            
            if(t[n] == 0) return 0;
            return 1;
}
void solve()
{
            int flow=0;
            
            while(bfs())
            {
                        for(nod *i=a[n]; i; i=i->n) 
                                    if(t[i->x]) //pt fiecare muchie (x, n) 
                                    {
                                                int mn=0x3f3f3f3f;
                                                for(int j=i->x; t[j]; j=t[j])
                                                            mn=min(mn, cap[t[j]][j]);
                                                mn=min(mn, cap[i->x][n]);
                                                if(mn <= 0) continue;
                                                
                                                cap[i->x][n]-=mn;
                                                cap[n][i->x]+=mn;
                                                
                                                for(int j=i->x; t[j]; j=t[j])
                                                            cap[t[j]][j]-=mn,
                                                            cap[j][t[j]]+=mn;
                                                flow+=mn;
                                    }
                        
            }
            
            printf("%d\n", flow);
            
}
int main()
{
            freopen("maxflow.in","r",stdin);
            freopen("maxflow.out","w",stdout);
            scanf("%d %d\n", &n, &m);
            while(m--)
            {
                        int p,q,c;
                        scanf("%d %d %d\n", &p, &q,&c);
                        nod *t=new nod;
                        t->x=q;
                        t->n=a[p];
                        a[p]=t;
                        t=new nod;
                        t->x=p;
                        t->n=a[q];
                        a[q]=t;
                        cap[p][q]=c;
            }
            
            solve();
            
            return 0;
}