Pagini recente » Cod sursa (job #869006) | Cod sursa (job #2233956) | Cod sursa (job #2875399) | Cod sursa (job #1717854) | Cod sursa (job #1345356)
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
#define ITERATOR vector <int>::iterator
const int NMAX = 1010, INF = 2e9;
int n;
bool vis[NMAX], vis1[NMAX], vis2[NMAX];
int dad[NMAX], cap[NMAX][NMAX], flow[NMAX][NMAX], x[NMAX], y[NMAX], c[NMAX];
vector <int> graph[NMAX], sol;
bool bfs () {
queue <int> q;
int node;
ITERATOR it;
memset(vis, 0, sizeof(vis));
memset(dad, 0, sizeof(dad));
vis[1] = 1;
q.push(1);
while(!q.empty()) {
node = q.front();
q.pop();
if(node == n)
continue;
for(it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis[*it] && flow[node][*it] < cap[node][*it]) {
q.push(*it);
dad[*it] = node;
vis[*it] = 1;
}
}
return vis[n];
}
int abs (int x) {
return x < 0 ? -x : x;
}
void dfs1 (int node) {
vis1[node] = 1;
for(ITERATOR it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis1[*it] && cap[node][*it] > flow[node][*it])
dfs1(*it);
}
void dfs2 (int node) {
vis2[node] = 1;
for(ITERATOR it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!vis2[*it] && cap[node][*it] > flow[node][*it])
dfs2(*it);
}
int main() {
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
int node, m, i, minFlow;
ITERATOR it;
scanf("%d%d", &n, &m);
for(i = 1; i <= m; ++ i) {
scanf("%d%d%d", &x[i], &y[i], &c[i]);
cap[x[i]][y[i]] = cap[y[i]][x[i]] = c[i];
graph[x[i]].push_back(y[i]);
graph[y[i]].push_back(x[i]);
}
while(bfs()) {
for(it = graph[n].begin(); it != graph[n].end(); ++ it) {
if(!vis[*it])
continue;
dad[n] = *it;
node = n;
minFlow = INF;
while(node != 1) {
minFlow = min(minFlow, cap[dad[node]][node] - flow[dad[node]][node]);
node = dad[node];
}
node = n;
while(node != 1) {
flow[dad[node]][node] += minFlow;
flow[node][dad[node]] -= minFlow;
node = dad[node];
}
}
}
dfs1(1);
dfs2(n);
for(i = 1; i <= m; ++ i)
if((vis1[x[i]] && vis2[y[i]]) || (vis1[y[i]] && vis2[x[i]]))
sol.push_back(i);
printf("%d\n", sol.size());
for(it = sol.begin(); it != sol.end(); ++ it)
printf("%d\n", *it);
return 0;
}