Pagini recente » Cod sursa (job #530033) | Cod sursa (job #1391650) | Cod sursa (job #1104471) | Cod sursa (job #2549931) | Cod sursa (job #2136147)
#include <fstream>
#include <vector>
#include <string.h>
#include <stdlib.h>
#define nmax 1005
#define mmax 10005
using namespace std;
fstream f1("critice.in", ios::in);
fstream f2("critice.out", ios::out);
///dupa ce aplicam algoritmul pt flux muchiile critice(x, y) sunt acelea cu cap[x][y]=flux[x][y]
///si care sunt continute in minim un drum de la 1 la n in care restul muchiilor de pe drum au cap[x'][y']> flux[x'][y']
int n, m, cap[nmax][nmax], flux[nmax][nmax], l[nmax], viz[nmax], coada[nmax], prim, ultim, k, FLUX;
int crit[mmax], nrcrit;
struct muchii
{
int x, y;
}muc[mmax];
vector <int> v[nmax];
void citire()
{
int i, x, y, c;
f1>>n>>m;
for(i=1; i<=m; i++)
{
f1>>x>>y>>c;
muc[i].x=x; muc[i].y=y;
cap[x][y]=c;
v[x].push_back(y);
v[y].push_back(x);
cap[y][x]=c;
///flux[x][y]=flux[y][x]=0;
}
}
void init()
{
memset(viz, 0, sizeof(viz));
prim=ultim=k=1;
coada[prim]=1;
viz[1]=1;
}
void bfs()
{
int nod;
init();
while(k!=0)
{
nod=coada[prim];
prim++;
k--;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
if((!viz[*it])&&(cap[nod][*it]> flux[nod][*it]))
{
ultim++;
k++;
coada[ultim]=*it;
l[*it]=nod;
viz[*it]=1;
}
}
}
int amelioreaza()
{
int ok=0, i, mini;///val maxima capacitate muchie
for(auto it=v[n].begin(); it!=v[n].end(); ++it)
{
mini=10000;
l[n]=*it; ///fixam noul drum
///verificam daca se poate ameliora
for(i=n; i!=1; i=l[i])
if(mini> cap[l[i]][i]-flux[l[i]][i])
mini=cap[l[i]][i]-flux[l[i]][i];
if(mini==0) ;
else
{
ok=1;
for(i=n; i!=1; i=l[i])
{
flux[l[i]][i]+=mini;
flux[i][l[i]]-=mini;
}
FLUX+=mini;
}
}
return ok;
}
void dinic()
{
bfs();
while(amelioreaza())
{
bfs();
}
}
int amelioreaza2()
{
int i, mini;///val maxima capacitate muchie
for(auto it=v[n].begin(); it!=v[n].end(); ++it)
{
mini=10000;
l[n]=*it; ///fixam noul drum
///verificam daca se poate ameliora
for(i=n; i!=1; i=l[i])
if(mini> cap[l[i]][i]-flux[l[i]][i])
mini=cap[l[i]][i]-flux[l[i]][i];
if(mini> 0) return 1;
}
return 0;
}
void solutie()
{
int i;
for(i=1; i<=m; i++)
if((cap[muc[i].x][muc[i].y]==flux[muc[i].x][muc[i].y])||(cap[muc[i].y][muc[i].x]==flux[muc[i].y][muc[i].x]))
{
cap[muc[i].x][muc[i].y]++;
cap[muc[i].y][muc[i].x]++;
bfs();
if(amelioreaza2())
{
nrcrit++;
crit[nrcrit]=i;
}
cap[muc[i].x][muc[i].y]--;
cap[muc[i].y][muc[i].x]--;
}
f2<<nrcrit<<"\n";
for(i=1; i<=nrcrit; i++)
f2<<crit[i]<<"\n";
}
int main()
{
citire();
dinic();
solutie();
///f2<<FLUX;
return 0;
}