Pagini recente » Cod sursa (job #511639) | Cod sursa (job #1960170) | Cod sursa (job #1864140) | Cod sursa (job #2786228) | Cod sursa (job #1005666)
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int N,M, src, dest;
int C[MAXN][MAXN], F[MAXN][MAXN], ant[MAXN];
bool viz[MAXN][2];
vector< pair<int,int> > e;
vector<int> G[MAXN];
void read()
{
freopen("critice.in","r",stdin);
scanf("%d %d", &N, &M);
for (int i = 0; i < M; ++i){
int a, b, cap;
scanf("%d %d %d", &a, &b, &cap);
e.push_back(make_pair(a,b));
C[a][b] = C[b][a] = cap;
G[a].push_back(b);
G[b].push_back(a);
}
}
int BFS(){
memset(ant, 0, sizeof(ant));
ant[src] = src;
queue<int> Q;
Q.push(src);
while (!Q.empty()){
int x = Q.front();
Q.pop();
if (x == dest)
continue;
for (vector<int>::iterator it = G[x].begin(); it != G[x].end(); ++it) {
if (!ant[*it] && C[x][*it] - F[x][*it] > 0) {
ant[*it] = x;
Q.push(*it);
}
}
}
return ant[dest];
}
void maxflow(){
src = 1;
dest = N;
while(BFS()){
for (vector<int>::iterator it = G[dest].begin(); it!=G[dest].end(); ++it) {
if (!ant[*it] || C[*it][dest] == F[*it][dest])
continue;
ant[dest] = *it;
int fmin = INF;
for (int x = dest; x!=src; x = ant[x]) {
fmin = min(fmin, C[ant[x]][x] - F[ant[x]][x]);
}
if (!fmin)
continue;
for (int x = dest; x!=src; x = ant[x]) {
F[ant[x]][x] += fmin;
F[x][ant[x]] -= fmin;
}
}
}
}
void bf(int src, int dest, int dir)
{
queue<int> Q;
Q.push(src);
viz[src][dir] = true;
while (!Q.empty()) {
int x = Q.front();
Q.pop();
if (x == dest)
continue;
for (vector<int>::iterator it = G[x].begin(); it != G[x].end(); ++it) {
if (!viz[*it][dir] && C[x][*it] > F[x][*it] && C[*it][x] > F[*it][x]) {
viz[*it][dir] = true;
Q.push(*it);
}
}
}
}
void print(vector<int> sol)
{
freopen("critice.out","w",stdout);
printf("%d\n",sol.size());
for (vector<int>::iterator it = sol.begin(); it!=sol.end(); ++it)
printf("%d\n", *it);
}
int main()
{
read();
maxflow();
bf(1,N,0);
bf(N,1,1);
vector<int> sol;
for (size_t i = 0; i<e.size(); ++i) {
int a = e[i].first;
int b = e[i].second;
if (F[a][b] == C[a][b] && viz[a][0] && !viz[b][0] && viz[b][1] && !viz[a][1]) {
sol.push_back(i + 1);
continue;
}
if (F[b][a] == C[b][a] && viz[b][0] && !viz[a][0] && viz[a][1] && !viz[b][1])
sol.push_back(i + 1);
}
print(sol);
return 0;
}