Cod sursa(job #1072768)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 4 ianuarie 2014 20:37:35
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>

using namespace std;

typedef pair<int,int> PII;
const int INF = (1<<30);
const int NMAX = 1001;
const int MMAX = 100001;

int N,M,sol;
int C[NMAX][NMAX];
int F[NMAX][NMAX];
int T[NMAX];
int S[MMAX];
PII E[MMAX];
int viz[NMAX];
vector<int> V[NMAX];
deque<int> Q;

int BFS(int S1,int S2,int D1,int D2)
{
    int x,y;
    vector<int>::iterator it;
    Q.resize(0);
    memset(viz,0,sizeof(viz));
    Q.push_back(S1);
    viz[S1]=S1;
    Q.push_back(S2);
    viz[S2]=S2;
    for(; !Q.empty();)
    {
        x=Q.front();
        Q.pop_front();
        for(it=V[x].begin(); it!=V[x].end(); it++)
        {
            if(C[x][*it]==F[x][*it] || C[*it][x]==F[*it][x] || viz[*it]) continue;
            y=*it;
            Q.push_back(y);
            viz[y]=viz[x];
            T[y]=x;
            if(viz[D1] && D1==D2) return 1;
            if(viz[D1] && viz[D2] && viz[D1]!=viz[D2]) return 1;
        }
    }
    if(D1==D2 && viz[D1]) return 1;
    if(viz[D1] && viz[D2] && viz[D1]!=viz[D2]) return 1;
    return 0;
}

int main()
{
    int i,a,b,c,x,v;
    vector<int>::iterator it;
    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,&b,&c);
        V[a].push_back(b);
        V[b].push_back(a);
        C[a][b]=C[b][a]=c;
        E[i]=make_pair(a,b);
    }
    for(; BFS(1,1,N,N);)
        for(it=V[N].begin(); it!=V[N].end(); it++)
        {
            if(C[N][*it]==F[N][*it] || C[*it][N]==F[*it][N] || !viz[*it]) continue;
            x=*it;
            T[N]=x;
            v=INF;
            for(x=N; x!=1; x=T[x])
                v=min(v,C[T[x]][x]-F[T[x]][x]);
            for(x=N; x!=1; x=T[x])
            {
                F[T[x]][x]+=v;
                F[x][T[x]]-=v;
            }
        }
    for(i=1; i<=M; i++)
    {
        a=E[i].first;
        b=E[i].second;
        if(C[a][b]!=F[a][b] && C[b][a]!=F[b][a]) continue;
        if(BFS(1,N,a,b))
            S[++sol]=i;
    }
    printf("%d\n",sol);
    for(i=1; i<=sol; i++)
        printf("%d\n",S[i]);
    return 0;
}