Pagini recente » Cod sursa (job #2031532) | Cod sursa (job #1412060) | Cod sursa (job #2337837) | Cod sursa (job #235858) | Cod sursa (job #927516)
Cod sursa(job #927516)
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
typedef pair <int, int> pereche;
#define Nmax 1000
vector <pereche> graf[Nmax];
queue <int> q;
int n, m, flow, r, k, unic, poz, minn;
int c[Nmax][Nmax], f[Nmax][Nmax];
bool sol[Nmax];
pereche t[Nmax];
void read(){
int x, y, z;
scanf("%i %i", &n, &m);
for(int i = 1; i <= m; ++i){
scanf("%i %i %i", &x, &y, &z);
graf[x].push_back(pereche(y,i));
graf[y].push_back(pereche(x,i));
c[x][y] += z;
c[y][x] += z;
}
fclose(stdin);
}
inline int min(int a, int b){
if(a > b) return b;
return a;
}
int bfs(){
int u, v;
memset(t, 0, sizeof(t));
q.push(1);
while(!q.empty()){
u = q.front();
q.pop();
if(u == n){
while(!q.empty()) q.pop();
return t[n].first;
}
for(int i = 0, size = graf[u].size(); i < size; ++i){
v = graf[u][i].first;
if(t[v].first == 0 && c[u][v] != f[u][v]){
t[v] = pereche(u, graf[u][i].second);
q.push(v);
}
}
}
return t[n].first;
}
void solve(){ // algoritmul lui dinic
int v;
while(bfs())
for(int i = 0, size = graf[n].size(); i < size; ++i){
v = graf[n][i].first;
if(t[v].first && c[v][n] != f[v][n]){
r = c[v][n] - f[v][n];
unic = 1;
minn = r;
poz = graf[n][i].second;
for(int j = v; j != 1; j = t[j].first){
r = min(r, c[t[j].first][j] - f[t[j].first][j]);
if(r < minn){
unic = 1;
minn = r;
poz = t[j].second;
}
else if(r == minn)
unic = 0, k++;
}
if(unic) sol[poz] = 1;
f[v][n] += r;
f[n][v] -= r;
for(int j = v; j != 1; j = t[j].first){
f[t[j].first][j] += r;
f[j][t[j].first] -= r;
}
}
}
}
void print(){
printf("%i\n", k);
for(int i = 1; i <= n; ++i)
if(sol[i]) printf("%i\n", i);
fclose(stdout);
}
int main(){
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
read();
solve();
print();
return 0;
}