Cod sursa(job #1072536)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 4 ianuarie 2014 16:23:23
Problema Critice Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 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 = 1005;
const int MMAX = 100005;

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

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

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,N);)
        for(it=V[N].begin();it!=V[N].end();it++)
        {
            x=*it;
            if(C[N][x]==F[N][x] || !viz[x]) continue;
            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,a) && BFS(N,b)) || (BFS(1,b) && BFS(N,a)))
            S[++sol]=i;
    }
    printf("%d\n",sol);
    for(i=1;i<=sol;i++)
        printf("%d\n",S[i]);
    return 0;
}