Pagini recente » Cod sursa (job #309437) | Cod sursa (job #574060) | Cod sursa (job #546041) | Cod sursa (job #1606672) | Cod sursa (job #2136200)
#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);
int n, m, cap[nmax][nmax], flux[nmax][nmax], l[nmax], viz[nmax], coada[nmax], prim, ultim, k, FLUX, viz1[nmax], viz2[nmax];
int crit[mmax], nrcrit;
struct muchii
{
int x, y;
}muc[mmax];
vector <int> v[nmax];
void dfs1(int nod)
{
int vec;
viz1[nod]=1;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
{
vec=*it;
if((!viz1[vec])&&(cap[nod][vec]!=flux[nod][vec])&&cap[vec][nod]!=flux[vec][nod])
dfs1(vec);
}
}
void dfs2(int nod)
{
int vec;
viz2[nod]=1;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
{
vec=*it;
if((!viz2[vec])&&(cap[nod][vec]!=flux[nod][vec])&&(cap[vec][nod]!=flux[vec][nod]))
dfs2(vec);
}
}
void solutie()
{
///v1[nod]=1 daca exista drum de la 1 la nod a.i. pt fiecare muchie prin de pe drum fluxul!=capacitatea
///v2[nod]=1 daca exista drum de la n la nod ai.i pt fiecare muchie prin de pe drum fluxul!=capacitatea
///muchiile critice sunt acele muchii(x, y) pt care:
///exista drum de la 1 la x cu toate muchiile cu fluxul!=capaciatea (viz[x]=1)
///exista drum de la n la y cu toate muchiile cu fluxul!=capaciatea (viz2[y]=1)
///capacitate[x][y]=flux[x][y]
dfs1(1);
dfs2(n);
for(int i=1; i<=m; i++)
{
int x=muc[i].x, y=muc[i].y;
if(cap[x][y]==flux[x][y])
{
if(viz[x]&&viz2[y])
{
nrcrit++;
crit[nrcrit]=i;
}
}
else if(cap[y][x]==flux[y][x])
{
if(viz[y]&&viz2[x])
{
nrcrit++;
crit[nrcrit]=i;
}
}
}
f2<<nrcrit<<"\n";
for(int i=1; i<=nrcrit; i++)
f2<<crit[i]<<"\n";
}
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;
for(auto it=v[n].begin(); it!=v[n].end(); ++it)
{
mini=10000;
l[n]=*it;
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;
for(auto it=v[n].begin(); it!=v[n].end(); ++it)
{
mini=10000;
l[n]=*it;
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;
}
int main()
{
citire();
dinic();
solutie();
return 0;
}