Pagini recente » Cod sursa (job #3326102) | Cod sursa (job #3336811) | Borderou de evaluare (job #3331288) | Borderou de evaluare (job #2971951) | Cod sursa (job #3331306)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
const int NMAX = 1005;
const int INF = 1e9;
struct Muchie{
int x,y,c,i;
Muchie(int _x=0, int _y=0, int _c=0, int _i=0):
x(_x), y(_y), c(_c), i(_i){}
};
int n,m,x,y,c;
int C[NMAX][NMAX];
int F[NMAX][NMAX];
int tata[NMAX];
bool viz[NMAX];
vector<int> adj[NMAX];
vector<Muchie> muchii_init;
bool gaseste_lant_nesaturat(){
memset(viz, 0, sizeof(viz));
queue<int> q;
q.push(1);
viz[1] = 1;
tata[1] = 0;
while(!q.empty()){
int nod = q.front();
q.pop();
for(auto& neigh: adj[nod]){
if(viz[neigh] == 0 && C[nod][neigh] > F[nod][neigh]){
q.push(neigh);
viz[neigh] = 1;
tata[neigh] = nod;
if(neigh == n)
return true;
}
else if(viz[neigh] == 0 && F[neigh][nod] > 0){
q.push(neigh);
viz[neigh] = 1;
tata[neigh] = -nod;
if(neigh == n)
return true;
}
}
}
return false;
}
bool in_S[NMAX],in_T[NMAX];
void bfs_din_sursa(){
queue<int> q;
q.push(1);
in_S[1] = true;
while(!q.empty()){
int u = q.front();
q.pop();
for(auto& v: adj[u]){
if(in_S[v] == 0 && C[u][v] - F[u][v] > 0){
in_S[v] = true;
q.push(v);
}
}
}
}
void bfs_din_destinatie(){
queue<int> q;
q.push(n);
in_T[n] = true;
while(!q.empty()){
int v = q.front();
q.pop();
for(auto& u: adj[v]){
if(in_T[u] == 0 && C[u][v] - F[u][v] > 0){
in_T[u] = true;
q.push(u);
}
}
}
}
int main(){
f >> n >> m;
for(int i=1; i<=m; i++){
f >> x >> y >> c;
muchii_init.push_back(Muchie(x,y,c,i));
adj[x].push_back(y);
adj[y].push_back(x);
C[x][y] = c;
C[y][x] = c;
}
while(gaseste_lant_nesaturat()){
int delta = INF;
for(int v= n; v!= 1;){
int u = tata[v];
if(u > 0){
delta = min(delta, C[u][v]-F[u][v]);
v = u;
}
else{
int real_u = -u;
delta = min(delta, F[v][real_u]);
v = real_u;
}
}
for(int v=n; v!=1; ){
int u = tata[v];
if(u >0){
F[u][v] += delta;
v = u;
}
else{
int real_u = -u;
F[v][real_u] -= delta;
v = real_u;
}
}
}
bfs_din_sursa();
bfs_din_destinatie();
vector<int> sol;
for(auto& m: muchii_init){
if(F[m.x][m.y] == m.c && in_S[m.x] && in_T[m.y]){
sol.push_back(m.i);
}
else if(F[m.y][m.x] == m.c && in_S[m.y] && in_T[m.x]){
sol.push_back(m.i);
}
}
g << sol.size() << '\n';
for(int idx: sol){
g << idx << '\n';
}
}