Pagini recente » Cod sursa (job #163621) | Cod sursa (job #2026665) | Cod sursa (job #855525) | Cod sursa (job #127502) | Cod sursa (job #1533804)
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define pii pair<int, int>
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define MAX 1005
#define INF 1<<30
using namespace std;
int n, m, x, y, z, F[MAX][MAX], C[MAX][MAX], flux, path[MAX];
pii lat[10 * MAX];
vector<int> l[MAX], sol;
bool viz[MAX], viz2[MAX];
bool bfs(){
memset(viz + 1, 0, n);
queue<int> q;
viz[1] = 1;
q.push(1);
while(!q.empty()){
int x = q.front();
q.pop();
if(x == n)
continue;
for(int i = 0; i < l[x].size(); i++){
int y = l[x][i];
if(!viz[y] && C[x][y] != F[x][y]){
viz[y] = 1;
path[y] = x;
q.push(y);
}
}
}
return viz[n];
}
void bfs2(int s, bool viz[]){
memset(viz + 1, 0, n);
queue<int> q;
viz[s] = 1;
q.push(s);
while(!q.empty()){
int x = q.front();
q.pop();
for (int i = 0; i < l[x].size(); i++){
int y = l[x][i];
if(C[x][y] == F[x][y] || C[y][x] == F[y][x] || viz[y])
continue;
viz[y] = 1;
q.push(y);
}
}
}
int main(){
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d%d%d", &x, &y, &z);
l[x].push_back(y);
l[y].push_back(x);
lat[i] = make_pair(x, y);
C[x][y] = z;
C[y][x] = z;
}
while(bfs())
for(int i = 0; i < l[n].size(); i++)
if(viz[l[n][i]] && C[l[n][i]][n] != F[l[n][i]][n]){
path[n] = l[n][i];
int u = n, minim = INF;
while(u != 1){
int v = path[u];
minim = min(minim, C[v][u] - F[v][u]);
u = v;
}
flux += minim;
u = n;
while(u != 1){
int v = path[u];
F[v][u] += minim;
F[u][v] -= minim;
u = v;
}
}
bfs2(1, viz);
bfs2(n, viz2);
for(int i = 1; i <= m; i++){
int x = lat[i].first, y = lat[i].second;
if(C[x][y] == F[x][y] && viz[x] && !viz[y] && viz2[y] && !viz2[x])
sol.push_back(i);
else if(C[y][x] == F[y][x] && viz[y] && !viz[x] && viz2[x] && !viz2[y])
sol.push_back(i);
}
printf("%d\n", (int)sol.size());
for(int i = 0; i < (int)sol.size(); i++)
printf("%d\n", sol[i]);
return 0;
}