Cod sursa(job #1945961)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 29 martie 2017 19:57:52
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define N 1001
#define inf 1<<29
using namespace std;

int c[N][N],t[N],ind[N][N],n,flow;
bool viz[N],viz1[N*10];
vector <int> G[N],sol;
vector <int>::iterator it;

void Read(){

    int m,x,y,i;
    freopen("critice.in","r",stdin);

    scanf("%d%d",&n,&m);
    for (i=1;i<=m;++i){

        scanf("%d%d",&x,&y);
        scanf("%d",&c[x][y]);
        c[y][x]=c[x][y];
        ind[x][y]=ind[y][x]=i;
        G[x].push_back(y);
        G[y].push_back(x);
        }
}

inline int Bfs(){

    queue <int> Q;
    int ok=0,node;

    memset(t,0,sizeof(t));
    t[1]=-1;Q.push(1);

    while (!Q.empty()){

        node=Q.front();Q.pop();

        for (it=G[node].begin();it!=G[node].end();++it)
            if (!t[*it] && c[node][*it]>0)
                if (*it!=n) {
                            Q.push(*it);
                            t[*it]=node;
                            }
                else ok=1;
        }

    return ok;
}

void Dinic(){

    int node,mini;

    for (int drum=Bfs();drum;drum=Bfs())

        for (it=G[n].begin();it!=G[n].end();++it)
            if (t[*it] && c[*it][n]>0){

                t[n]=*it;mini=inf;node=n;

                while (node!=1) {
                                mini=min(mini,c[t[node]][node]);
                                node=t[node];
                                }
                flow+=mini;node=n;

                while (node!=1) {
                                c[t[node]][node]-=mini;
                                c[node][t[node]]+=mini;
                                node=t[node];
                                }
                }

}

void Bf(int sens){

    int i,node;
    queue <int> Q;

    memset(viz,0,sizeof(viz));
    if (sens) {Q.push(1);viz[1]=1;}
    else {Q.push(n);viz[n]=n;}

    while(!Q.empty()){

        node=Q.front();Q.pop();

        for (it=G[node].begin();it!=G[node].end();++it)
            if (c[*it][node]&c[node][*it]) if (!viz[*it]) {
                                                     viz[*it]=1;
                                                     Q.push(*it);
                                                    }
                                           else continue;
            else if (sens) if (!viz1[ind[*it][node]]) viz1[ind[*it][node]]=1;
                           else continue;
                 else if (viz1[ind[*it][node]]) sol.push_back(ind[*it][node]);
        }
}

void Write(){

    freopen("critice.out","w",stdout);

    printf("%d\n",sol.size());
    for (it=sol.begin();it!=sol.end();++it)
        printf("%d\n",*it);

}

int main()
{
    Read();
    Dinic();
    Bf(1);
    Bf(0);
    Write();
    return 0;
}