Cod sursa(job #1095375)

Utilizator apopeid14Apopei Daniel apopeid14 Data 30 ianuarie 2014 20:20:23
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 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 vizf[NMAX];
bool viz1[NMAX];
bool viz2[NMAX];
vector<int> V[NMAX];
deque<int> Q;
 
int BFS_f(int S,int D)
{
    int x,y;
    vector<int>::iterator it;
    Q.resize(0);
    memset(vizf,0,sizeof(vizf));
    Q.push_back(S);
    vizf[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] || vizf[y]) continue;
            Q.push_back(y);
            vizf[y]=1;
            T[y]=x;
            if(y==D) return vizf[D];
        }
    }
    return vizf[D];
}
 
void BFS_1(int S)
{
    int x,y;
    vector<int>::iterator it;
    Q.resize(0);
    memset(viz1,0,sizeof(viz1));
    Q.push_back(S);
    viz1[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] || viz1[y]) continue;
            Q.push_back(y);
            viz1[y]=1;
            T[y]=x;
        }
    }
}
 
void BFS_2(int S)
{
    int x,y;
    vector<int>::iterator it;
    Q.resize(0);
    memset(viz2,0,sizeof(viz2));
    Q.push_back(S);
    viz2[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] || viz2[y]) continue;
            Q.push_back(y);
            viz2[y]=1;
            T[y]=x;
        }
    }
}
 
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_f(1,N);)
        for(it=V[N].begin(); it!=V[N].end(); it++)
        {
            x=*it;
            if(C[N][x]==0 || C[N][x]==F[N][x] || !vizf[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;
            }
        }
    BFS_1(1);
    BFS_2(N);
    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((viz1[a] && viz2[b]) || (viz1[b] && viz2[a]))
            S[++sol]=i;
    }
    printf("%d\n",sol);
    for(i=1; i<=sol; i++)
        printf("%d\n",S[i]);
    return 0;
}