Cod sursa(job #1698181)

Utilizator cojocarugabiReality cojocarugabi Data 3 mai 2016 22:39:39
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define db long double
int F[1 << 10][1 << 10];
bitset < 1024 > d1,d2;
int d[1 << 10];
vector < int > s[1 << 10];
int bfs(int n)
{
    d[1] = 0;
    for (int i = 2;i <= n;++i) d[i] = -1;
    queue < int > Q;
    Q.push(1);
    while (!Q.empty() && d[n] == -1)
    {
        int node = Q.front();
        Q.pop();
        for (auto vertex : s[node])
            if (d[vertex] == -1 && F[node][vertex])
                Q.push(vertex),d[vertex] = node;
    }
    if (d[n] == -1) return 0;
    int flow = 1e9;
    for (int vertex = n;vertex != 1;vertex = d[vertex])
        flow = min(flow,F[d[vertex]][vertex]);
    for (int vertex = n;vertex != 1;vertex = d[vertex])
        F[d[vertex]][vertex] -= flow,F[vertex][d[vertex]] += flow;
    return flow;
}
void dfs1(int node)
{
    d1[node] = 1;
    for (auto it : s[node])
        if (F[node][it] && F[it][node] && !d1[it]) dfs1(it);
}
void dfs2(int node)
{
    d2[node] = 1;
    for (auto it : s[node])
        if (F[node][it] && F[it][node] && !d2[it]) dfs2(it);
}
int main(void)
{
    int n,m;
    ios_base :: sync_with_stdio(0);
    ifstream fi("critice.in");
    ofstream fo("critice.out");
    fi>>n>>m;
    vector < pair < int , int > > edge;
    while (m --)
    {
        int a,b,c;
        fi>>a>>b>>c;
        s[a].push_back(b);
        s[b].push_back(a);
        edge.push_back({a,b});
        F[a][b] += c;
        F[b][a] += c;
    }
    while (bfs(n));
    dfs1(1);
    dfs2(n);
    m = edge.size();
    vector < int > ans;
    for (int i = 0;i < m;++i)
        if ((!F[edge[i].x][edge[i].y] || !F[edge[i].y][edge[i].x]) && ((d1[edge[i].x] && d2[edge[i].y]) || (d1[edge[i].y] && d2[edge[i].x]))) ans.push_back(i + 1);
    fo << (ans.size()) << '\n';
    for (auto it : ans) fo << it << '\n';
    return 0;
}