Cod sursa(job #1535833)

Utilizator cristibogdanPatrascu Cristian cristibogdan Data 25 noiembrie 2015 11:21:29
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
#define NMAX 1024
#define INF 0x3f3f3f3f
int C[NMAX][NMAX];
int F[NMAX][NMAX];
int TT[NMAX];
vector<int> G[NMAX];
int n,m;
int cd[NMAX];
int viz[NMAX],viz2[NMAX],p,u,vv[1044];
struct du{
    int X,Y;}v[1001];
int bfs()
{
    int i, j, nod, V;

    cd[0] = 1;
    cd[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;

    for (i = 1; i <= cd[0]; i++)
    {
        nod = cd[i];
                if (nod == n) continue;
        for (j = 0; j < G[nod].size(); j++)
            {
                V = G[nod][j];
                if (C[nod][V] == F[nod][V] || viz[V]) continue;
                viz[V] = 1;
                cd[ ++cd[0] ] = V;
                TT[V] = nod;
            }
    }

    return viz[n];
}
void re (){
    cd[1]=n;
        viz2[n]=1;
            p=u=1;
            int x,nod;
                while(p<=u){
                        x=cd[p];
        for(size_t j=0;j<G[x].size();j++)
        {
            nod=G[x][j];
            if(viz2[nod]==0 && C[nod][x]>F[nod][x] )
            {
                viz2[nod]=1;
                cd[++u]=nod;
                }}
            p++;
                }
}
int main()
{
        int i, flow, fmin, x, y, c, nod,k=0;
   f>>n>>m;
   for(i=1;i<=m;i++){
        f>>x>>y>>c;
        v[i].X=x;
        v[i].Y=y;
   G[x].push_back(y);
   G[y].push_back(x);
   C[x][y]+=c;
   }
   for (flow = 0; bfs();)
       for (i=0;i < G[n].size(); i++)
        {
            nod = G[n][i];
            if (F[nod][n] == C[nod][n] || !viz[nod]) continue;
            TT[n] = nod;
            fmin=INF;
            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;
            }

            flow += fmin;
        }
        re();
    for(i=1;i<=m;i++)
            if(F[v[i].X][v[i].Y]==C[x][y]||F[v[i].Y][v[i].X]==C[y][x])
                    if((viz[v[i].X]==1&&viz2[v[i].Y]==1) || (viz[v[i].Y]==1&&viz2[v[i].X]==1))
               vv[++k]=i;



    g<<k<<'\n';
    for(i=1;i<=k;i++)
        g<<vv[i]<<'\n';



    return 0;
}