Cod sursa(job #1155436)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 26 martie 2014 21:49:09
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#define maxn 1005
#define inf 999999999
using namespace std;
vector <pair<int,int> > V;
vector <int> G[maxn],sol;
queue <int> Q;
int tt[maxn],viz[maxn],C[maxn][maxn],F[maxn][maxn],flux,n,m,x,y,r,fmin,ver1[maxn],ver2[maxn],nr;

int bfs(){
    Q.push(1);
    int x,y;
    for(int i=1;i<=n;++i)
        viz[i]=0;
    viz[1]=1;
    while(!Q.empty()){
        x=Q.front(); Q.pop();
        if(n==x)
            continue;

        for(int i=0;i<G[x].size();++i){
            y=G[x][i];
            if(C[x][y]==F[x][y] || viz[y]==1)
                continue;
            viz[y]=1;
            Q.push(y);
            tt[y]=x;
        }
    }
    return viz[n];
}
void ad1(int s){
    ver1[s]=1;
    for(int i=0;i<G[s].size();++i){
           int nod=G[s][i];
        if(!ver1[nod] && max(F[nod][s],F[s][nod])!=C[s][nod]){
            ad1(nod);
        }
    }
}
void ad2(int s){
    ver2[s]=1;
    for(int i=0;i<G[s].size();++i){
           int nod=G[s][i];
        if(!ver2[nod] && max(F[nod][s],F[s][nod])!=C[s][nod]){
            ad2(nod);
        }
    }
}
int main(){
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&x,&y,&r);
        C[x][y]=C[y][x]=r;
        V.push_back(make_pair(x,y));
        G[x].push_back(y);
        G[y].push_back(x);
    }
    flux=0;
    while(bfs()){
       for(int i=0;i<G[n].size();++i){
            int nod=G[n][i];
            if( viz[nod]==0 || C[nod][n]==F[nod][n])
                continue;
            tt[n]=nod;
            fmin=inf;
            for(int y=n;y!=1;y=tt[y]){
                fmin=min(fmin,C[tt[y]][y]-F[tt[y]][y]);
            }
            if(!fmin)
                continue;
            for(int y=n;y!=1; y=tt[y]){
                F[tt[y]][y]+=fmin;
                F[y][tt[y]]-=fmin;
            }

       }
    }
    ad1(1);
    ad2(n);
    for(int i=0;i<V.size();++i){
        if(ver1[V[i].first] && ver2[V[i].second] || ver1[V[i].second] && ver2[V[i].first])
            sol.push_back(i+1);
    }
    printf("%d\n", sol.size());
    for(int i=0;i<sol.size();++i)
        printf("%d\n",sol[i]);
    return 0;
}