Pagini recente » Cod sursa (job #2090376) | Cod sursa (job #3290293) | Cod sursa (job #53866) | Cod sursa (job #2015316) | Cod sursa (job #568747)
Cod sursa(job #568747)
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
ifstream in("critice.in");
ofstream out("critice.out");
struct muc{
int a, b;
};
const int N = 1001;
const int M = 10001;
const int INF = 0x3f3f3f;
int n, m;
int fat[N];
int c[N][N];
int f[N][N];
muc mucs[M];
bool viz[N];
void Read()
{
in >> n >> m;
for (int i = 1; i <= m; ++i)
{
int cap;
in >> mucs[i].a >> mucs[i].b >> cap;
c[mucs[i].a][mucs[i].b] = cap;
c[mucs[i].b][mucs[i].a] = cap;
}
}
bool Bfs()
{
queue <int> q;
memset(viz, 0, sizeof(viz));
viz[1] = 1;
q.push(1);
while (!q.empty() && !viz[n])
{
int node = q.front();
for (int i = 1; i <= n; ++i)
if (!viz[i] && f[node][i] < c[node][i])
{
q.push(i);
viz[i] = true;
fat[i] = node;
}
q.pop();
}
return viz[n];
}
void GetMaxFlow()
{
while (Bfs())
{
int node = n;
int minFlow = INF;
while (node != 1)
{
minFlow = min(minFlow, c[fat[node]][node] - f[fat[node]][node]);
node = fat[node];
}
node = n;
while (node != 1)
{
f[fat[node]][node] += minFlow;
f[node][fat[node]] -= minFlow;
node = fat[node];
}
}
}
queue <int> q;
bool sDist[N];
bool dDist[N];
int noCritics, critics[N];
void Check(int node)
{
for (int i = 1; i <= n; ++i)
if (!sDist[i] && c[node][i] > 0 && c[node][i] - f[node][i] > 0)
{
sDist[i] = true;
q.push(i);
}
}
void CrossSource()
{
q.push(1);
sDist[1] = true;
while (!q.empty())
{
Check(q.front());
q.pop();
}
}
void Check2(int node)
{
for (int i = 1; i <= n; ++i)
if (!dDist[i] && c[node][i] > 0 && c[node][i] - f[node][i] > 0)
{
dDist[i] = true;
q.push(i);
}
}
void CrossDestination()
{
q.push(n);
dDist[n] = true;
while (!q.empty())
{
Check2(q.front());
q.pop();
}
}
void GetCritics()
{
for (int i = 1; i <= m; ++i)
if (c[mucs[i].a][mucs[i].b] - f[mucs[i].a][mucs[i].b] == 0)
{
if (sDist[mucs[i].a] && dDist[mucs[i].b])
critics[++noCritics] = i;
else if (dDist[mucs[i].b] && dDist[mucs[i].a])
critics[++noCritics] = i;
}
}
void PrintCritics()
{
out << noCritics << "\n";
for (int i = 1; i <= noCritics; ++i)
out << critics[i] << "\n";
}
int main()
{
Read();
GetMaxFlow();
CrossSource();
CrossDestination();
GetCritics();
PrintCritics();
return 0;
}