Cod sursa(job #887173)

Utilizator stoicatheoFlirk Navok stoicatheo Data 23 februarie 2013 16:25:05
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
#define maxn 1005
#define pb push_back
#define mp make_pair
#define forEach(G) for( typeof(G.begin()) it = G.begin(); it != G.end(); ++ it)
int n,m;
int C[maxn][maxn];
int F[maxn][maxn];
int q[maxn];
int TT[maxn];
int show[maxn*12];
int flux;
bool mark1[maxn];
bool markn[maxn];
vector< pair<int,int> > edges;
vector<int> graf[maxn];
void read()
{
    in >> n >> m;
    int a,b,c;
    while(m--)
    {
        in >> a >> b >> c;
        graf[a].pb(b);
        graf[b].pb(a);
        edges.pb(mp(a,b));
        C[a][b]=c;
        C[b][a]=c;
    }
}

bool bfs()
{
    memset(TT,0,sizeof(TT));
    int i,nod;
    q[0]=1;
    q[1]=1;
    TT[1]=1;
    for(i=1;i <= q[0]; ++ i)
    {
        nod = q[i];
        if(nod == n)
            continue;
        forEach(graf[nod])
        {
            if(TT[*it] || C[nod][*it] == F[nod][*it])
                continue;

            TT[*it] = nod;
            q[++q[0]] = (*it);
        }
    }
    return TT[n];
}

void aug()
{

    int nod;
    int fmin;
    while(bfs())
    {
        forEach(graf[n])
        {
            if(!TT[*it] || C[*it][n] == F[*it][n])
                continue;
            TT[n] = *it;
            fmin = 1 << 29;
            for(nod = n; nod != 1; nod = TT[nod])
                fmin = min(fmin,C[ TT[nod] ][ nod ] - F[ TT[nod] ][ nod ]);

            if(fmin == 0)
                continue;

            for(nod = n; nod != 1;nod = TT[nod])
            {
                F[TT[nod]][nod] += fmin;
                F[nod][TT[nod]] -= fmin;
            }
            flux += fmin;
        }
    }
}

void mark(int nod,bool * wat,bool dir)
{
    wat[nod]=1;
    forEach(graf[nod])
    {
        if(wat[*it])
            continue;
        if(dir == 0)
        {
            if(C[nod][*it] > F[nod][*it])
                mark(*it,wat,dir);
        }
        else
        {
            if(C[*it][nod] > F[*it][nod])
                mark(*it,wat,dir);
        }
    }
}
void pass()
{
    forEach(edges)
    {
        if(mark1[it->first] && markn[it->second] && C[it->first][it->second] == F[it->first][it->second])
            show[++show[0]] = it-edges.begin()+1;
        else if(markn[it->first] && mark1[it->second] && C[it->second][it->first] == F[it->second][it->first])
            show[++show[0]] = it-edges.begin()+1;
    }
}
void solve()
{
    aug();
    mark(1,mark1,0);
    mark(n,markn,1);
    pass();
}
void afis()
{
    int i;
    for(i=0;i<=show[0];++i)
        out << show[i] << "\n";
}
int main()
{
    read();
    solve();
    afis();
    return 0;
}