Pagini recente » Istoria paginii utilizator/alexandru.ciornei | Cod sursa (job #1272024) | Cod sursa (job #484948) | Cod sursa (job #463018) | Cod sursa (job #581648)
Cod sursa(job #581648)
#include <fstream>
using namespace std;
const int N=10001;
int cap[N][N],flux[N][N],ind[N][N],r[10*N],T[N],v[N],n;
bool okay[N][N],use[N];
ifstream in("critice.in");
ofstream out("critice.out");
inline void sch(int &a,int &b)
{
int c=a;a=b;b=c;
}
bool bfs(int X,int Y)
{
int x,y,st=0,dr=0;
v[++dr]=X;
for (x=1;x<=n;x++)
{
use[x]=false;
T[x]=0;
}
while (st<dr)
{
x=v[++st];
use[x]=true;
for (y=1;y<=n;y++)
{
if (!use[y] && cap[x][y]>flux[x][y])
{
if (y!=Y)
{
v[++dr]=y;
T[y]=x;
}
use[y]=true;
}
}
}
return use[Y];
}
void BFS(int X,int Y)
{
int x,y,st=0,dr=0;
v[++dr]=X;
for (x=1;x<=n;x++)
use[x]=false;
while (st<dr)
{
x=v[++st];
use[x]=true;
for (y=1;y<=n;y++)
if (flux[x][y]>0)
{
if (flux[x][y]<cap[x][y])
v[++dr]=y;
if (flux[x][y]==cap[x][y])
okay[x][y]=true;
}
}
st=dr=0;
sch(X,Y);
v[++dr]=X;
while (st<dr)
{
x=v[++st];
use[x]=true;
for (y=1;y<=n;y++)
if (flux[y][x]>0)
{
if (flux[y][x]<cap[y][x])
v[++dr]=y;
if (flux[y][x]==cap[y][x] && okay[y][x])
r[++r[0]]=ind[x][y];
}
}
}
void max_flow(int X,int Y)
{
int M,i,j;
while (bfs(X,Y))
for (i=X;i<Y;i++)
{
M=cap[i][Y]-flux[i][Y];
if (!M)
continue;
for (j=i;j>X;j=T[j])
M=min(M,cap[T[j]][j]-flux[T[j]][j]);
if (!M)
continue;
T[Y]=i;
for (j=Y;j!=X;j=T[j])
{
flux[T[j]][j]+=M;
flux[j][T[j]]-=M;
}
}
}
int main()
{
int m,x,y,c;
in>>n>>m;
for (int i=1;i<=m;i++)
{
in>>x>>y>>c;
cap[x][y]=cap[y][x]=c;
ind[x][y]=ind[y][x]=i;
}
max_flow(1,n);
BFS(1,n);
sort(r+1,r+r[0]+1);
for (int i=0;i<=r[0];i++)
out<<r[i]<<"\n";
return 0;
}