Cod sursa(job #1899836)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 2 martie 2017 22:41:43
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <fstream>
#define pi pair<int,int>
#define x first
#define y second
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int MAX_INF=0x3f3f3f3f;
int f[1001][1001],c[1001][1001],n,tata[1001];
pi edge[10001];
vector<int>H[1001],sol;
bitset<1001>viz,source,sink;
queue<int>Q;
bool bfs()
{
    viz[1]=1;
    Q.push(1);
    while(Q.size())
    {
        int a=Q.front();
        Q.pop();
        if(a==n) continue;
        for(vector<int>::iterator it=H[a].begin();it!=H[a].end();it++)
        {
            //int dp=*it;
            if(viz[*it]==0&& (c[a][*it]!=f[a][*it]))
            {
                viz[*it]=1;
                Q.push(*it);
                tata[*it]=a;
            }
        }
    }
    if(viz[n]==1) return 1;
    return 0;
}
void BFS(int start,bitset<1001> &use)
{
    use[start]=1;
    Q.push(start);
    while(Q.size())
    {
        int a=Q.front();
        Q.pop();
        for(vector<int>::iterator it=H[a].begin();it!=H[a].end();it++)
        {
            if(use[*it]==0)
            {
                int flux=f[a][*it];
                if(flux<0) flux=-flux;
                if(c[a][*it]>flux)
                {
                    use[*it]=1;
                    Q.push(*it);
                }
            }
        }
    }
}
int main()
{
    int m,i,cost,a,b,fmin;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>cost;
        edge[i].x=a;edge[i].y=b;
        c[a][b]=cost;
        c[b][a]=cost;
        H[a].push_back(b);
        H[b].push_back(a);
    }
    int flux=0;
    while(bfs())
    {
        for(vector<int>::iterator it=H[n].begin();it!=H[n].end();it++)
        {
            if(c[*it][n]!=f[*it][n]&&viz[*it]==1)
            {
                fmin=MAX_INF;
                tata[n]=*it;
                for(i=n;i!=1;i=tata[i])
                {
                    fmin=min(fmin,c[tata[i]][i]-f[tata[i]][i]);
                }
                if(fmin==0) continue;
                flux+=fmin;
                for(i=n;i!=1;i=tata[i])
                {
                    f[tata[i]][i]+=fmin;
                    f[i][tata[i]]-=fmin;
                }
            }
        }
        viz.reset();
    }
    BFS(1,source);
    BFS(n,sink);
    for(i=1;i<=m;i++)
    {
        int x=edge[i].x,y=edge[i].y;
        if((source[x]&&sink[y])||(sink[x]&&source[y]))
        {
            if(c[x][y]==f[x][y]||c[y][x]==f[y][x])
            {
                sol.push_back(i);
            }
        }
    }
    fout<<sol.size()<<"\n";
    for(vector<int>::iterator it=sol.begin();it!=sol.end();it++) fout<<*it<<"\n";
}