Pagini recente » Cod sursa (job #2080953) | Cod sursa (job #2369645) | Cod sursa (job #2035477) | Cod sursa (job #2938745) | Cod sursa (job #1698181)
# 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;
}