Pagini recente » Cod sursa (job #3361122) | Cod sursa (job #3361065) | Cod sursa (job #3361108) | Cod sursa (job #3361109) | Cod sursa (job #3361116)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <set>
#include <queue>
// #include <bits/std++.h>
#define in fin
#define out fout
using namespace std;
const int NMAX = 1000;
ifstream fin("critice.in");
ofstream fout("critice.out");
struct muchie{
int x, y, pereche, f, c, idx;
};
vector<muchie> mch;
vector<int> g[NMAX];
bool mrc[NMAX];
bool crm[NMAX];
pair<int, int> last[NMAX];
bool done_cu_flux = 0;
int n, m;
void fa_bfs_te_rog(){
for(int i = 1; i <= n; i++){
mrc[i] = 0;
last[i] = {0, -1};
}
queue<int> q;
q.push(1);
mrc[1] = 1;
while(!q.empty()){
int x = q.front(); q.pop();
for(const int &cine : g[x]){ // cine a INTREBAT
// mi-o lowk stricat chefu de deltarune flowery
// mai bine fac info decat sa ma bat cu el
int y = mch[cine].y;
int id = cine;
if(!mrc[y] && mch[id].f < mch[id].c && (done_cu_flux || mch[ mch[id].pereche ].f < mch[ mch[id].pereche ].c)){
q.push(y);
mrc[y] = 1;
last[y] = {x, id};
}
}
}
}
void gor_et_sfb_af(){
for(int i = 1; i <= n; i++){
crm[i] = 0;
last[i] = {0, -1};
}
queue<int> q;
q.push(n);
crm[n] = 1;
while(!q.empty()){
int x = q.front(); q.pop();
for(const int &cine : g[x]){ // cine a INTREBAT
// mi-o lowk stricat chefu de deltarune flowery
// mai bine fac info decat sa ma bat cu el
int y = mch[cine].y;
int id = cine;
if(!crm[y] && mch[id].f < mch[id].c && mch[ mch[id].pereche ].f < mch[ mch[id].pereche ].c){
q.push(y);
crm[y] = 1;
}
}
}
}
int zi_cine_e_minimul(int nod, int minim_ude){
while(last[nod].second != -1){
minim_ude = min(minim_ude, mch[ last[nod].second ].c - mch[ last[nod].second ].f);
nod = last[nod].first;
if(minim_ude == 0) break;
}
return minim_ude;
}
void satureaza_pls(int nod, int add){
while(last[nod].second != -1){
int id = last[nod].second;
mch[id].f += add;
mch[ mch[id].pereche ].f -= add;
nod = last[nod].first;
}
}
signed main(){
ios_base::sync_with_stdio(false);
in.tie(NULL);
in >> n >> m;
vector<int> ralsei;
for(int i = 0; i < m; i++){
int x, y, c; in >> x >> y >> c;
int id = mch.size(), idp = mch.size() + 1;
mch.push_back({ x, y, idp, 0, c, i + 1 });
mch.push_back({ y, x, id, 0, c, i + 1 }); // ca e neorientat au ambele c
g[x].push_back(id);
g[y].push_back(idp);
if(y == n) ralsei.push_back(id);
if(x == n) ralsei.push_back(idp);
}
while(true){
fa_bfs_te_rog(); // multumesc frumos
if(!mrc[n]) break;
// im home alone si lowk cred ca halucinez ca tot aud chestii si NU is pisicii
// TwT
// cerr << "am ajuns!\n";
for(const int &id : ralsei){
int y = mch[id].x;
if(!mrc[y]) continue; // ge ge getouttt
// cerr << "--> incerc cu y = " << y << '\n';
int add = zi_cine_e_minimul(y, mch[id].c - mch[id].f);
// cerr << "--> add = " << add << '\n';
if(add > 0){
satureaza_pls(y, add);
mch[id].f += add;
mch[ mch[id].pereche ].f -= add;
}
}
}
done_cu_flux = 1;
fa_bfs_te_rog();
gor_et_sfb_af();
set<int> ant_tenna;
for(const muchie &x : mch){
bool bun = 1;
if(mrc[x.x] == mrc[x.y] || crm[x.x] == crm[x.y]) bun = 0;
if(bun){
ant_tenna.insert(x.idx);
}
}
// cout << "muchii saturate :";
// for(const muchie &x : mch){
// if(x.c == x.f){
// cout << "( " << x.x << " , " << x.y << " )\n";
// }
// }
// cout << "mrc : ";
// for(int i = 1; i <= n; i++) cout << mrc[i] << " ";
// cout << '\n';
// cout << "crm : ";
// for(int i = 1; i <= n; i++) cout << crm[i] << " ";
// cout << '\n';
out << ant_tenna.size() << '\n';
for(const auto &x : ant_tenna){
out << x << '\n';
}
return 0;
}