Cod sursa(job #1964393)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 13 aprilie 2017 13:25:46
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

queue<int> q;
vector<int> v[1010];
int n,cap[1010][1010],flow[1010][1010],v1[1010][1010],tata[1010],rez[10010];
char vaz[1010],vaz1[1010];

int bfs(int S,int D)
{
    for(int i=1;i<=n;i++) vaz[i]=0;
    vaz[S]=1;
    q.push(S);
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(int i=0;i<v[nod].size();i++)
        {
            int nod1=v[nod][i];
            if(vaz[nod1]==1 or cap[nod][nod1]==flow[nod][nod1]) continue;
            vaz[nod1]=1;
            if(nod1!=D) q.push(nod1);
            tata[nod1]=nod;
        }
    }
    return vaz[D];
}

int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    int m,x,y,c,l=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        cap[x][y]=c;
        cap[y][x]=c;
        v1[x][y]=i;v1[y][x]=i;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    int S=1,D=n;
    while(bfs(S,D))
    {
        for(int i=0;i<v[D].size();i++)
        {
            int nod=v[D][i];
            if(vaz[nod]==0 or cap[nod][D]==flow[nod][D]) continue;
            tata[D]=nod;
            int s=1e9;
            for(int a=D;a!=S;a=tata[a]) s=min(s,cap[tata[a]][a]-flow[tata[a]][a]);
            for(int a=D;a!=S;a=tata[a])
            {
                flow[tata[a]][a]+=s;
                flow[a][tata[a]]-=s;
            }
        }
    }
    vaz1[D]=1;
    q.push(D);
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(int i=0;i<v[nod].size();i++)
        {
            int nod1=v[nod][i];
            if(vaz1[nod1]==1 or flow[nod1][nod]==cap[nod1][nod]) continue;
            vaz1[nod1]=1;
            q.push(nod1);
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=0;j<v[i].size();j++)
        {
            int nod=v[i][j];
            if(cap[i][nod]==flow[i][nod] && vaz[i]==1 && vaz1[nod]==1) rez[++l]=v1[i][nod];
        }
    printf("%d\n",l);
    sort(rez+1,rez+l+1);
    for(int i=1;i<=l;i++)
        printf("%d\n",rez[i]);
    return 0;
}