Cod sursa(job #675303)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 7 februarie 2012 15:15:52
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1024
#define INF (1<<30)
using namespace std;

ifstream in("critice.in");
ofstream out("critice.out");

inline int _min(int a,int b){if(a<b) return a;return b;}

queue<int> Q;
vector<int> V[nmax];

int Mx[nmax],My[nmax],Mc[nmax],T[nmax];
int C[nmax][nmax];
bool Critic[nmax][nmax];
int M,N,critic;

bool BS()
{
    int x,i,y;
    while(!Q.empty())Q.pop();
    for(i=1;i<=N;i++)T[i]=0;
    Q.push(1);
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        for(i=0;i<V[x].size();i++)
        {
            y = V[x][i];
            if(!T[y]&&C[x][y])
            {
                T[y] = x;
                Q.push(y);
                if(y==N)
                    return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int i,x,y,muchie_minima,t,tt;
    in>>N>>M;
    for(i=1;i<=M;i++)
    {
        in>>Mx[i]>>My[i]>>Mc[i];
        V[Mx[i]].push_back(My[i]);
        V[My[i]].push_back(Mx[i]);
        C[Mx[i]][My[i]] +=Mc[i];
    }
    while(BS())
    {
        for(i=0;i<V[N].size();i++)
        {
            x = V[N][i];
            if(!T[x]||!C[x][N])continue;
            T[N] = x;
            muchie_minima = INF;
            x = N;
            while(x!=1)
            {
                if(muchie_minima>C[T[x]][x])
                    t=x,tt=T[x],muchie_minima=C[T[x]][x];
                x=T[x];
            }
            Critic[t][tt]=Critic[tt][t]=1;
            critic++;
            x = N;
            while(x!=1)
                C[T[x]][x]-=muchie_minima,C[x][T[x]]+=muchie_minima,x=T[x];
        }
    }
    out<<critic<<'\n';
    for(i=1;i<=M;i++)
        if(Critic[Mx[i]][My[i]])
            out<<i<<'\n';
    return 0;
}