Pagini recente » Clasament bulangandit5 | Cod sursa (job #1117317) | Cod sursa (job #1018976) | Cod sursa (job #1279291) | Cod sursa (job #409366)
Cod sursa(job #409366)
#include<fstream.h>
#include<iostream.h>
#define u (1<<30)
int ver[129999],leg[129999],start[699],cost[129999],d[699],D,fa[699],c[699][699],rez,nr[699][699],q[4499990],L,
h[699],hh[699],S[699][699],mod[699][699];
void bf()
{
int i,ok=1,t;
for(i=1;i<=D;i++)
d[i]=u;
d[1]=0;
while(ok)
{
ok=0;
for(i=1;i<=D;i++)
{
t=start[i];
while(t)
{
if(c[i][ver[t]]&&d[ver[t]]>d[i]+S[i][ver[t]])
{
d[ver[t]]=d[i]+S[i][ver[t]];
ok=1;
}
t=leg[t];
}
}
}
}
void percolate(int nod)
{
int safe=h[nod];
while(nod>1&&d[h[nod>>1]]>d[safe])
{
hh[h[nod>>1]]=nod;
h[nod]=h[nod>>1];
nod>>=1;
}
hh[safe]=nod;
h[nod]=safe;
}
int root()
{
int safe=h[1],son,ls,rs,nod=1;
hh[h[L]]=1;
h[1]=h[L--];
do
{
son=0;
ls=(nod<<1);
rs=1+ls;
if(ls<=L)
{
son=ls;
if(rs<=L&&d[h[rs]]<d[h[ls]])
son=rs;
if(d[h[son]]>=d[h[nod]])
son=0;
}
if(son)
{
hh[h[son]]=nod;
hh[h[nod]]=son;
ls=h[nod];
h[nod]=h[son];
h[son]=ls;
nod=son;
}
}
while(son);
hh[safe]=0;
return safe;
}
int dijkstra()
{
int i,t,nod,temp;
for(i=1;i<=D;i++)
{
t=start[i];
while(t)
{
if(d[i]!=u&&d[ver[t]]!=u)
{
S[i][ver[t]]+=d[i]-d[ver[t]];
mod[i][ver[t]]+=d[i]-d[ver[t]];
}
t=leg[t];
}
}
for(i=1;i<=D;i++)
{
d[i]=u;
h[i]=hh[i]=i;
fa[i]=0;
}
d[1]=0;
L=D;
while(L)
{
nod=root();
if(d[nod]==u)
L=0;
else
{
t=start[nod];
while(t)
{
if(hh[ver[t]]&&c[nod][ver[t]]&&d[ver[t]]>d[nod]+S[nod][ver[t]])
{
d[ver[t]]=d[nod]+S[nod][ver[t]];
fa[ver[t]]=nod;
percolate(hh[ver[t]]);
}
t=leg[t];
}
}
}
if(d[D]!=u)
{
temp=d[D];
i=D;
while(i!=1)
{
c[fa[i]][i]--;
c[i][fa[i]]++;
temp-=mod[fa[i]][i];
i=fa[i];
}
rez+=temp;
return 1;
}
return 0;
}
int main()
{
int i,x,y,z,n,m,e,q=0,sol=0,j,v[1399];
ifstream f("cmcm.in");
ofstream g("cmcm.out");
f>>n>>m>>e;
for(i=1;i<=e;i++)
{
f>>x>>y>>z;
x++;
y+=n+1;
ver[++q]=y;
leg[q]=start[x];
start[x]=q;
S[x][y]=z;
S[y][x]=-z;
ver[++q]=x;
leg[q]=start[y];
start[y]=q;
nr[x][y]=i;
c[x][y]=1;
}
for(i=2;i<=n+1;i++)
{
ver[++q]=i;
leg[q]=start[1];
start[1]=q;
c[1][i]=1;
ver[++q]=1;
leg[q]=start[i];
start[i]=q;
}
D=n+m+2;
for(i=2;i<=m+1;i++)
{
ver[++q]=D;
leg[q]=start[n+i];
start[n+i]=q;
c[n+i][D]=1;
ver[++q]=n+i;
leg[q]=start[D];
start[D]=q;
}
bf();
while(dijkstra());
v[0]=0;
for(i=2;i<=n+1;i++)
for(j=n+2;j<D;j++)
if(nr[i][j]&&!c[i][j])
{
sol++;
v[++v[0]]=nr[i][j];
}
g<<sol<<' '<<rez<<'\n';
for(i=1;i<=v[0];i++)
g<<v[i]<<' ';
return 0;
}