Pagini recente » Cod sursa (job #448076) | Istoria paginii runda/oni2011-uh | Cod sursa (job #1044879) | Cod sursa (job #192471) | Cod sursa (job #573054)
Cod sursa(job #573054)
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
struct edge{
int a, b;
};
const int N = 1001;
const int M = 10001;
const int INF = 0x3f3f3f;
int n, m;
int fat[N];
int check[N];
int c[N][N];
int f[N][N];
bool vis[N];
edge edges[M];
void Read()
{
in >> n >> m;
for (int i = 1; i <= m; ++i)
{
int cap;
in >> edges[i].a >> edges[i].b >> cap;
c[edges[i].a][edges[i].b] = cap;
c[edges[i].b][edges[i].a] = cap;
}
}
bool Road()
{
memset(vis, 0, sizeof(vis));
queue <int> q;
q.push(1);
vis[1] = true;
while (!q.empty() && !vis[n])
{
int node = q.front();
for (int i = 1; i <= n; ++i)
{
if (vis[i] || c[node][i] <= f[node][i])
continue;
vis[i] = true;
fat[i] = node;
q.push(i);
}
q.pop();
}
return vis[n];
}
void GetMaxFlow()
{
while (Road())
{
int node = n;
int minFlow = INF;
while (node != 1)
{
if (c[fat[node]][node] - f[fat[node]][node] < minFlow)
minFlow = c[fat[node]][node] - f[fat[node]][node];
node = fat[node];
}
node = n;
if (minFlow == 0)
continue;
while (node != 1)
{
f[fat[node]][node] += minFlow;
f[node][fat[node]] -= minFlow;
node = fat[node];
}
}
}
void Digg(int node, int val)
{
check[node] = val;
for (int i = 1; i <= n; ++i)
if (!check[i] && c[node][i] > f[node][i])
Digg(i, val);
}
int CountCriticNodes()
{
int result = 0;
for (int i = 1; i <= m; ++i)
if (check[edges[i].a] + check[edges[i].b] == 444)
++result;
return result;
}
void PrintCriticNodes()
{
for (int i = 1; i <= m; ++i)
if (check[edges[i].a] + check[edges[i].b] == 444)
out << i << "\n";
}
int main()
{
Read();
GetMaxFlow();
Digg(1, 123);
Digg(n, 321);
out << CountCriticNodes() << "\n";
PrintCriticNodes();
return 0;
}