Pagini recente » Borderou de evaluare (job #2726210) | Borderou de evaluare (job #2731185) | Borderou de evaluare (job #1523003) | Cod sursa (job #1967696) | Cod sursa (job #2603461)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, m, i, x, y, k, c[1005][1005], f[1005][1005], tata[1005], viz[1005];
struct muchie{
int x, y;
} a[10005];
vector <int> g[1005];
queue <int> q, sol;
void que(){
memset(viz, 0, sizeof(viz));
viz[1] = 1, q.push(1);
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i=0; i<g[nod].size(); i++){
int nou = g[nod][i];
if(!viz[nou] && f[nod][nou] < c[nod][nou])
viz[nou] = 1, tata[nou] = nod, q.push(nou);
}
}
}
int mi(int nod){
int Min = c[nod][n]-f[nod][n];
while(nod > 1){
Min = min(Min, c[tata[nod]][nod]-f[tata[nod]][nod]);
nod = tata[nod];
}
return Min;
}
void back(){
for(int i = 0; i < g[n].size(); i++){
int nod = g[n][i];
if(viz[nod]){
int Min = mi(nod);
if(!Min)
continue;
f[nod][n] += Min;
f[n][nod] -= Min;
while(nod > 1){
int nou = tata[nod];
f[nou][nod] += Min;
f[nod][nou] -= Min;
nod = nou;
}
}
}
}
void bfs1(){
viz[1] = 1, q.push(1);
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i = 0; i < g[nod].size(); i++){
int nou = g[nod][i];
if(!viz[nou] && f[nod][nou] < c[nod][nou])
viz[nou] = 1, q.push(nou);
}
}
}
void bfs2(){
viz[n] = 2, q.push(n);
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i = 0; i < g[nod].size(); i++){
int nou = g[nod][i];
if(!viz[nou] && f[nou][nod] < c[nou][nod])
viz[nou] = 2, q.push(nou);
}
}
}
int main()
{
fin>>n>>m;
for(i = 1; i <= m; i++){
fin>>x>>y>>k;
a[i] = {x,y};
c[x][y] = c[y][x] = k;
g[x].push_back(y);
g[y].push_back(x);
}
while(!viz[n]){
que();
if(viz[n])
back();
viz[n] = !viz[n];
}
memset(viz, 0, sizeof(viz));
bfs1();
bfs2();
for(i = 1; i <= m; i++)
if(viz[a[i].x] && viz[a[i].y] && viz[a[i].x] != viz[a[i].y])
sol.push(i);
fout << sol.size() << '\n';
while(!sol.empty()){
fout << sol.front() << '\n';
sol.pop();
}
return 0;
}