Cod sursa(job #1410302)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 30 martie 2015 23:20:29
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define nmax 1005
#define mmax 10001
using namespace std;
FILE *fo=fopen("critice.in","r"),*g=fopen("critice.out","w");
vector <int> l[nmax];
struct muc{
    int x,y;
}mucs[mmax];
int c[nmax][nmax],f[nmax][nmax],t[nmax],n,s,d,vizi[3][nmax],r[mmax],k;
int bf()
{
    queue <int> q;
    int i,j,x,ok=0;
    for(i=1;i<=n;i++)
        t[i]=0;
    t[s]=-1;
    q.push(1);
    for(;!q.empty();q.pop())
    {
        x=q.front();
        for(i=0;i<l[x].size();i++)
        {
            j=l[x][i];
            if(t[j]==0&&c[x][j]>f[x][j])
            {
                if(j!=d)
                {
                    t[j]=x;
                    q.push(j);
                }
                else
                    ok=1;
            }
        }
    }
    return ok;
}
void dinic()
{
    int i,j,pas,mini,h;
    for(pas=bf();pas>0;pas=bf())
    {
        for(i=0;i<l[d].size();i++)
        {
            j=l[d][i];
            if(t[j]!=0&&c[j][d]>f[j][d])
            {
                mini=nmax+5;
                t[d]=j;
                for(h=d;h!=s;h=t[h])
                    mini=min(mini,c[t[h]][h]-f[t[h]][h]);
                if(mini>0)
                    for(h=d;h!=s;h=t[h])
                    {
                        f[t[h]][h]+=mini;
                        f[h][t[h]]-=mini;
                    }
            }
        }
    }
}
void bfs(int x,int ind)
{
    queue <int> q;
    int i,j,h;
    q.push(x);
    vizi[ind][x]=1;
    for(;!q.empty();q.pop())
    {
        x=q.front();
        for(i=0;i<l[x].size();i++)
        {
            j=l[x][i];
            if(vizi[ind][j]==0&&c[x][j]>abs(f[x][j]))
            {
                vizi[ind][j]=1;
                q.push(j);
            }
        }
    }
}
int main()
{
    int i,j,x,y,m;
    fscanf(fo,"%d %d",&n,&m);
    s=1; d=n;
    for(i=1;i<=m;i++)
    {
        fscanf(fo,"%d %d",&x,&y);
        mucs[i].x=x;
        mucs[i].y=y;
        fscanf(fo,"%d",&c[x][y]);
        c[y][x]=c[x][y];
        l[x].push_back(y);
        l[y].push_back(x);
    }
    dinic();
    bfs(s,1);
    bfs(d,2);
    //cout<<flux;
    for(i=1;i<=m;i++)
    {
        int z,zz;
        z=mucs[i].x; zz=mucs[i].y;
        if(((vizi[1][z]&&vizi[2][zz])||(vizi[2][z]&&vizi[1][zz]))&&c[z][zz]==abs(f[z][zz]))
            r[++k]=i;
    }
    fprintf(g,"%d\n",k);
    for(i=1;i<=k;i++)
        fprintf(g,"%d\n",r[i]);
    fclose(fo);
    fclose(g);
    return 0;
}