Cod sursa(job #1169230)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 10 aprilie 2014 18:28:31
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <cstdio>
#include <vector>
#define Nmax 1005
#define Mmax 10005
#define INF 2000000000

using namespace std;

int N,C[Nmax][Nmax],F[Nmax][Nmax],tata[Nmax],Q[Nmax],sol[Mmax];
bool viz[Nmax],saturat[Nmax][Nmax],v1[Nmax],v2[Nmax];
vector <int> L[Nmax];

struct edge
{
    int x,y;
};
edge a[Mmax];

inline bool Bfs()
{
    int i,nod,n,len,st,dr;
    for(i=2;i<=N;++i)
        viz[i]=false;
    viz[1]=true;
    st=dr=Q[1]=1;
    while(st<=dr)
    {
        nod=Q[st++];
        if(nod==N)
            continue;
        len=L[nod].size();
        for(i=0;i<len;++i)
        {
            n=L[nod][i];
            if(!viz[n] && F[nod][n]<C[nod][n])
            {
                viz[n]=true;
                tata[n]=nod;
                Q[++dr]=n;
            }
        }
    }
    return viz[N];
}

inline void MaxFlow()
{
    int n,i,len,minflow;
    while(Bfs())
    {
        len=L[N].size();
        for(i=0;i<len;++i)
        {
            n=L[N][i];
            if(viz[n] && C[n][N]>F[n][N])
            {
                tata[N]=n;
                minflow=INF;
                for(n=N;tata[n];n=tata[n])
                    minflow=min(minflow,C[tata[n]][n]-F[tata[n]][n]);
                if(!minflow)
                    continue;
                for(n=N;tata[n];n=tata[n])
                {
                    F[tata[n]][n]+=minflow;
                    F[n][tata[n]]-=minflow;
                }
            }
        }
    }
}

inline void Dfs(int a, bool v[])
{
    int i,len,n;
    v[a]=true;
    len=L[a].size();
    for(i=0;i<len;++i)
    {
        n=L[a][i];
        if(!v[n] && !saturat[a][n] && !saturat[n][a] && F[a][n]<C[a][n])
            Dfs(n,v);
    }
}

int main()
{
    int M,x,y,z,i;
    freopen ("critice.in","r",stdin);
    freopen ("critice.out","w",stdout);
    scanf("%d%d", &N,&M);
    for(i=1;i<=M;++i)
    {
        scanf("%d%d%d", &a[i].x,&a[i].y,&z);
        L[a[i].x].push_back(a[i].y);
        L[a[i].y].push_back(a[i].x);
        C[a[i].x][a[i].y]=C[a[i].y][a[i].x]=z;
    }
    MaxFlow();
    for(i=1;i<=M;++i)
    {
        if(C[a[i].x][a[i].y]==F[a[i].x][a[i].y])
            saturat[a[i].x][a[i].y]=true;
        if(C[a[i].y][a[i].x]==F[a[i].y][a[i].x])
            saturat[a[i].y][a[i].x]=true;
    }
    Dfs(1,v1); Dfs(N,v2);
    for(i=1;i<=M;++i)
        if(saturat[a[i].x][a[i].y] || saturat[a[i].y][a[i].x])
            if((v1[a[i].x] && v2[a[i].y]) || (v1[a[i].y] && v2[a[i].x]))
                sol[++sol[0]]=i;
    for(i=0;i<=sol[0];++i)
        printf("%d\n", sol[i]);
    return 0;
}