Cod sursa(job #2447192)

Utilizator CharacterMeCharacter Me CharacterMe Data 12 august 2019 13:20:28
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
#define inf 2147483647
using namespace std;
int n, m, i, j, k;
int cmax[1001][1001], flow[1001][1001], last[1001];
bool vis[1001];
vector<int> graph[1001], sol;
vector<pair<int, int> > edges;
queue<int> q;

void read();
void solve();
void write();
bool bfs();
void dfs(int node);
int main()
{
    read();
    solve();
    write();
    return 0;
}
void read(){
    freopen("critice.in", "r", stdin);
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; ++i){
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        graph[x].push_back(y);
        graph[y].push_back(x);
        edges.push_back({x, y});
        cmax[x][y]=cmax[y][x]=c;
    }
    return;
}
void solve(){
    while(bfs()){
        for(auto node:graph[n]){
            if(!vis[node] || flow[node][n]==cmax[node][n]) continue;
            last[n]=node;
            int parc, newflow=inf;
            for(parc=n; parc!=1; parc=last[parc]) newflow=min(newflow, cmax[last[parc]][parc]-flow[last[parc]][parc]);
            if(!newflow) continue;
            for(parc=n; parc!=1; parc=last[parc]){
                flow[last[parc]][parc]+=newflow;
                flow[parc][last[parc]]-=newflow;
            }
        }
    }
    for(i=1; i<=n; ++i) vis[i]=false;
    dfs(1);
    for(i=0; i<edges.size(); ++i) if(vis[edges[i].first]!=vis[edges[i].second]) sol.push_back(i+1);
    return;
}
void write(){
    freopen("critice.out", "w", stdout);
    printf("%d\n", int(sol.size()));
    for(auto i:sol) printf("%d\n", i);
    return;
}
bool bfs(){
    for(i=1; i<=n; ++i) last[i]=0, vis[i]=false;
    q.push(1); vis[1]=true;
    while(!q.empty()){
        int node=q.front(); q.pop();
        if(node==n) continue;
        for(auto next:graph[node]){
            if(vis[next] || flow[node][next]==cmax[node][next]) continue;
            q.push(next); vis[next]=true; last[next]=node;
        }
    }
    return vis[n];
}
void dfs(int node){
    vis[node]=true;
    for(auto next:graph[node]) {
        if(vis[next] || flow[node][next]==cmax[node][next]) continue;
        dfs(next);
    }
    return;
}