Cod sursa(job #1004296)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 2 octombrie 2013 15:43:00
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <utility>
 
#define maxn 1003
#define inf 1<<30////////////////////////////////////////////////
#define vint vector<int>::iterator
 
using namespace std;
 
ifstream fin("critice.in");
ofstream fout("critice.out");
 
vector <int> G[maxn],S;
vector <pair<int,int> > L;
int C[maxn][maxn],F[maxn][maxn],T[maxn],mark[maxn][maxn],q[maxn];
bool viz[maxn],viz2[maxn];
int n,m,a,b,c,nr;
 
 
bool bfs ()
{
    memset (viz,0,n+1);
    int s=1,l=1;
    q[s]=1;
    viz[1]=1;
 
    for (;s<=l;++s)
    {
       if (q[s]==n) continue;
       int x=q[s];
       for (vint it = G[x].begin(); it!=G[x].end(); ++it)
       {
           if (viz[*it] || C[x][*it]==F[x][*it]) continue;
           viz[*it] = 1;
           q[++l] = *it;
           T[*it] = x;
       }
    }
 
    return viz[n];
}
 
bool bfs2 ()
{
    memset (viz2,0,n+1);
    int s=1,l=1;
    q[s]=n;
    viz2[n]=1;
 
    for (;s<=l;++s)
    {
       if (q[s]==1) continue;
       int x=q[s];
       for (vint it = G[x].begin(); it!=G[x].end(); ++it)
       {
           if (viz2[*it] || F[x][*it]==-C[x][*it]) continue;
           viz2[*it] = 1;
           q[++l] = *it;
       }
    }
 
    return viz2[n];
}
 
int main()
{
    fin>>n>>m;
 
    for (int i=1; i<=m; ++i)
    {
        fin>>a>>b>>c;
        G[a].push_back(b);
        G[b].push_back(a);
        C[a][b]=c;
        C[b][a]=c;
        L.push_back(make_pair(a,b));
    }
 
    int flow=0;
 
    while (bfs())
    {
        for (vint it = G[n].begin(); it!=G[n].end(); ++it)
        {
             if (!viz[*it] || F[*it][n]==C[*it][n]) continue;
             T[n]=*it;
 
             int minf=inf;
             for (int i=n; i!=1; i=T[i])
             {
                 minf = min (minf,C[T[i]][i] - F[T[i]][i]);
             }
 
             for (int i=n; i!=1; i=T[i])
             {
                 F[T[i]][i] += minf;
                 F[i][T[i]] -= minf;
             }
             flow += minf;
        }
    }
 
    bfs2();
 
    for (int i=0; i<L.size(); ++i)
    {
        if ((viz[L[i].first]&&viz2[L[i].second]) || (viz[L[i].second]&&viz2[L[i].first]))
        {
            S.push_back (i+1);
        }
    }
 
    fout<<S.size()<<"\n";
    for (int i=0; i<S.size(); ++i)
       fout<<S[i]<<"\n";
}