Pagini recente » Cod sursa (job #2562928) | Cod sursa (job #1718401) | Cod sursa (job #282349) | Istoria paginii planificare/sedinta-20090403 | Cod sursa (job #1462667)
#include<bits/stdc++.h>
using namespace std;
int n;
queue<int> q;
vector<int> v[1005], ans;
vector<pair<int, int> >e;
int viz[1005], f[1005][1005], c[1005][1005], tata[1005];
int mark1[1005];
int mark2[1005];
int dfs(int nod, int m[]) {
m[nod] = 1;
for(int i = 0; i < v[nod].size(); ++i)
if(m[v[nod][i]] == 0 && c[nod][v[nod][i]] != f[nod][v[nod][i]])
dfs(v[nod][i], m);
}
int bfs() {
for(int i = 0; i < n; ++i)
viz[i] = 0;
q.push(0);
viz[0] = 1;
while(!q.empty()) {
int x = q.front();
q.pop();
if(x != n - 1) {
for(int i = 0; i < v[x].size(); ++i) {
if(viz[v[x][i]] == 0 && f[x][v[x][i]] != c[x][v[x][i]]) {
q.push(v[x][i]);
viz[v[x][i]] = 1;
tata[v[x][i]] = x;
}
}
}
}
return viz[n - 1];
}
int main()
{
int m, a, b, d;
FILE *fin = fopen("critice.in", "r");
FILE *fout = fopen("critice.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(int i = 0; i < m; ++i) {
fscanf(fin, "%d %d %d", &a, &b, &d);
--a; --b;
v[a].push_back(b);
v[b].push_back(a);
c[a][b] = d;
c[b][a] = d;
e.push_back(make_pair(a, b));
}
while(bfs()) {
for(int j = 0; j < v[n - 1].size(); ++j) {
int nod = v[n - 1][j];
if(viz[nod] == 1 && f[nod][n - 1] != c[nod][n - 1]) {
tata[n - 1] = nod;
int minim = 20000;
for(int i = n - 1; i != 0; i = tata[i])
if(minim > c[tata[i]][i] - f[tata[i]][i])
minim = c[tata[i]][i] - f[tata[i]][i];
if(minim != 0) {
for(int i = n - 1; i != 0; i = tata[i]) {
f[tata[i]][i] += minim;
f[i][tata[i]] -= minim;
}
}
}
}
}
dfs(0, mark1);
dfs(n - 1, mark2);
for(int i = 0; i < m; ++i) {
a = e[i].first;
b = e[i].second;
if(((f[a][b] == c[a][b]) && (mark1[a] == 1 && mark2[b] == 1)) || ((f[b][a] == c[b][a]) && (mark2[a] == 1 && mark1[b] == 1)))
ans.push_back(i + 1);
}
fprintf(fout, "%d\n", ans.size());
for(int i = 0; i < ans.size(); ++i)
fprintf(fout, "%d\n", ans[i]);
}