Pagini recente » Cod sursa (job #2902031) | Cod sursa (job #1005189) | Cod sursa (job #2624728) | Cod sursa (job #556576) | Cod sursa (job #2099020)
#include <bits/stdc++.h>
#define MAXN 1000
#define MAXM 10000
#define INF 1000000000
#define BUF_SIZE 1 << 14
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
if(pbuf==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fi);
pbuf=0;
}
return buf[pbuf++];
}
inline int nextnum(){
int a = 0;
char c = nextch();
while(!isdigit(c))
c = nextch();
while(isdigit(c)){
a = a * 10 + c - '0';
c = nextch();
}
return a;
}
int S, D;
std::vector <int> G[1 + MAXN];
std::vector <int> V;
int C[1 + MAXN][1 + MAXN];
int F[1 + MAXN][1 + MAXN];
int I[1 + MAXN][1 + MAXN];
int q[1 + MAXN];
int father[1 + MAXN];
int viz[1 + MAXN];
int bfs(){
q[0] = 1;
q[1] = S;
memset(viz, 0, sizeof(viz));
viz[S] = 1;
for(int i = 1; i <= q[0]; i++){
int node = q[i];
if(node != D)
for(int j = 0; j < G[node].size(); j++){
int vecin = G[node][j];
if(!viz[vecin] && C[node][vecin] != F[node][vecin]){
viz[vecin] = 1;
q[++q[0]] = vecin;
father[vecin] = node;
}
}
if(viz[D])
return viz[D];
}
return viz[D];
}
int main(){
fi = fopen("critice.in","r");
fo = fopen("critice.out","w");
int n = nextnum(), m = nextnum();
for(int i = 1; i <= m; i++){
int x = nextnum(), y = nextnum(), z = nextnum();
I[x][y] = i;
I[y][x] = i;
C[x][y] += z;
C[y][x] += z;
G[x].push_back(y);
G[y].push_back(x);
}
S = 1;
D = n;
int flow = 0;
while(bfs()){
for(int i = 0; i < G[D].size(); i++){
int node = G[D][i];
if(viz[node] && C[node][D] != F[node][D]){
father[D] = node;
int fmin = INF;
for(int node = D; node != S; node = father[node])
fmin = std::min(fmin, C[father[node]][node] - F[father[node]][node]);
if(fmin != 0)
for(int node = D; node != S; node = father[node]){
F[father[node]][node] += fmin;
F[node][father[node]] -= fmin;
}
flow += fmin;
}
}
}
for(int i = 1; i <= n; i++)
for(auto j: G[i])
if(I[i][j]){
C[i][j]++;
C[j][i]++;
if(bfs()) V.push_back(I[i][j]);
C[i][j]--;
C[j][i]--;
}
fprintf(fo,"%d\n", V.size() / 2);
std::sort(V.begin(), V.end());
int prev = 0;
for(int i = 0; i < V.size(); i++)
if(V[i] != prev){
fprintf(fo,"%d\n", V[i]);
prev = V[i];
}
fclose(fi);
fclose(fo);
return 0;
}