Pagini recente » Cod sursa (job #1581455) | Cod sursa (job #1399295) | Cod sursa (job #412124) | Cod sursa (job #2251492) | Cod sursa (job #1345371)
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
#define ITERATOR vector <int>::iterator
const int NMAX = 1010, INF = 2e9, MMAX = 10005;
int n;
bool vis[NMAX], vis1[NMAX], vis2[NMAX];
int dad[NMAX], cap[NMAX][NMAX], flow[NMAX][NMAX], x[MMAX], y[MMAX], c[MMAX];
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] && cap[node][*it] > flow[node][*it]) {
q.push(*it);
dad[*it] = node;
vis[*it] = 1;
}
}
return vis[n];
}
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] && cap[*it][node] > flow[*it][node])
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] && cap[*it][node] > flow[*it][node])
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;
}