Cod sursa(job #719335)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 21 martie 2012 19:02:54
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.76 kb
#include <cstdio>
#include <algorithm>
#define N 1005
#define M 10005
#define inf 1999999999
using namespace std;
struct nod{ int val; nod *urm; }*G[N];
int n,m,cap[N][N],flux[N][N],tata[N],c[N],viz[N],muc[N][N],nr[N];
int pas,k,sol[M];
void read()
{ int x,y,z,i;
  nod *aux;
freopen("critice.in","r",stdin); scanf("%d %d\n",&n,&m);
for(i=1;i<=m;++i)
    {
    scanf("%d %d %d\n",&x,&y,&z);
    cap[x][y]=cap[y][x]=z;
    muc[x][y]=muc[y][x]=i;
    aux=new nod; aux->val=y; aux->urm=G[x]; G[x]=aux;
    aux=new nod; aux->val=x; aux->urm=G[y]; G[y]=aux;
    }
fclose(stdin);
}
int bf()
{ int p,u;
  nod *aux;
p=u=1; c[1]=1; viz[1]=pas; tata[1]=0;
while(p<=u)
    {
    if(c[p]!=n)
    {
    for(aux=G[c[p]];aux!=NULL;aux=aux->urm)
        if(viz[aux->val]!=pas&&cap[c[p]][aux->val]>flux[c[p]][aux->val])
            {
            c[++u]=aux->val; tata[aux->val]=c[p]; viz[aux->val]=pas;
            }
    }
    ++p;
    }
if(viz[n]==pas)return 1;
return 0;
}
inline int min(int x,int y)
{
if(x<y)return x;
return y;
}
void maxflow()
{ nod *aux;
  int i,fm;
pas=1;
while(bf())
    {
    for(aux=G[n];aux!=NULL;aux=aux->urm)
        if(viz[aux->val]==pas&&cap[aux->val][n]>flux[aux->val][n])
            {
            tata[n]=aux->val; fm=inf;
            for(i=n;i!=1;i=tata[i])
                fm=min(fm,cap[tata[i]][i]-flux[tata[i]][i]);
            if(fm==0)continue;
            for(i=n;i!=1;i=tata[i])
                {
                flux[tata[i]][i]+=fm;
                flux[i][tata[i]]-=fm;
                }
            }
    ++pas;
    }
}
void solve()
{ bool e,merge,ad;
  int i,x,y,p,u;
  nod *aux;
for(i=1;i<=n;++i)viz[i]=0;
e=true; pas=1;
while(e)
    {
    e=false;
    p=u=1; c[1]=1; viz[1]=pas; tata[1]=0; nr[1]=0;
    while(p<=u)
        {
        if(c[p]!=n)
        {
        for(aux=G[c[p]];aux!=NULL;aux=aux->urm)
            if(viz[aux->val]!=pas)
            {
            if(cap[c[p]][aux->val]>flux[c[p]][aux->val])
                    {
                    c[++u]=aux->val; tata[aux->val]=c[p]; viz[aux->val]=pas;
                    }
            else if(cap[c[p]][aux->val]==flux[c[p]][aux->val])
                {
                c[++u]=aux->val; tata[aux->val]=c[p]; viz[aux->val]=pas; nr[aux->val]=nr[c[p]]+1;
                }
            }
        }
        ++p;
        }
    if(viz[n]==pas)
        {
        if(cap[tata[n]][n]==flux[tata[n]][n])--nr[n];
        e=true;
        for(aux=G[n];aux!=NULL;aux=aux->urm)
            {
            merge=false;
            if(viz[aux->val]==pas&&cap[aux->val][n]>=flux[aux->val][n])merge=true;
            if(merge)
                {
                tata[n]=aux->val;
                if(cap[tata[n]][n]==flux[tata[n]][n]){ ++nr[n]; ad=true; }
                    else ad=false;
                x=y=0; merge=true;
                for(i=n;i!=1&&merge;i=tata[i])
                    if(nr[i]==1){ x=tata[i]; y=i; }
                    else if(nr[i]>1){
                                    if(cap[tata[i]][i]==flux[tata[i]][i])
                                        {
                                         flux[tata[i]][i]+=inf;
                                         flux[i][tata[i]]-=inf;
                                        }
                                     merge=false;
                                    }
               if(merge) { sol[++k]=muc[x][y]; flux[x][y]+=inf; flux[y][x]-=inf; }
               if(ad)--nr[n];
                }
            }
        }
    ++pas;
    }
}
void write()
{ int i;
freopen("critice.out","w",stdout); printf("%d\n",k);
for(i=1;i<=k;++i) printf("%d\n",sol[i]);
fclose(stdout);
}
int main()
{
read();
maxflow();
k=0;
solve();
sort(sol+1,sol+k+1);
write();
return 0;
}