Cod sursa(job #1703075)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 16 mai 2016 09:39:13
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define MAXN 2010
#define inf 2000000010
using namespace std;
vector<int> g[MAXN],solution;
vector<pair<int,int> > edges;
int capacity[MAXN][MAXN],flow[MAXN][MAXN],source,sink;
int dad[MAXN],Queue[MAXN],seen[MAXN];
int minimum(int a,int b){
    if(a<b)
        return a;
    return b;
}
bool FirstBFS(){
    int node,i,left=1,right=1;
    memset(seen,0,sizeof(seen));
    seen[source]=1;
    Queue[1]=source;
    while(left<=right){
        node=Queue[left];
        left++;
        if(node==sink)
            continue;
        for(i=0;i<g[node].size();i++){
            if(seen[g[node][i]]==1||capacity[node][g[node][i]]==flow[node][g[node][i]])
                continue;
            seen[g[node][i]]=1;
            right++;
            Queue[right]=g[node][i];
            dad[g[node][i]]=node;
        }
    }
    if(seen[sink]==1)
        return true;
    return false;
}
void SecondBFS(int start,int value,bool ok){
    int i,node,left=1,right=1;
    Queue[left]=start;
    seen[start]=value;
    while(left<=right){
        node=Queue[left];
        left++;
        for(i=0;i<g[node].size();i++)
            if(ok==false&&seen[g[node][i]]!=value&&capacity[node][g[node][i]]>flow[node][g[node][i]]){
                right++;
                Queue[right]=g[node][i];
                seen[g[node][i]]=value;
            }
            else
                if(ok==true&&seen[g[node][i]]!=value&&capacity[g[node][i]][node]>flow[g[node][i]][node]){
                    right++;
                    Queue[right]=g[node][i];
                    seen[g[node][i]]=value;
                }
    }
}
int main(){
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    int n,m,i,x,y,c,maximumFlow=0,add,node;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&c);
        g[x].push_back(y);
        g[y].push_back(x);
        capacity[x][y]+=c;
        capacity[y][x]+=c;
        edges.push_back(make_pair(x,y));
    }
    source=1;
    sink=n;
    while(FirstBFS()==true)
        for(i=0;i<g[sink].size();i++){
            if(seen[g[sink][i]]==0||capacity[g[sink][i]][sink]<=flow[g[sink][i]][sink])
                continue;
            dad[sink]=g[sink][i];
            add=inf;
            for(node=sink;node!=source;node=dad[node])
                add=minimum(add,capacity[dad[node]][node]-flow[dad[node]][node]);
            if(add==0)
                continue;
            for(node=sink;node!=source;node=dad[node]){
                flow[dad[node]][node]+=add;
                flow[node][dad[node]]-=add;
            }
            maximumFlow+=add;
        }
    memset(seen,0,sizeof(seen));
    SecondBFS(source,1,false);
    SecondBFS(sink,2,true);
    for(i=0;i<m;i++)
        if(seen[edges[i].first]+seen[edges[i].second]==3)
            solution.push_back(i+1);
    printf("%d\n",solution.size());
    for(i=0;i<solution.size();i++)
        printf("%d\n",solution[i]);
    return 0;
}