Pagini recente » Cod sursa (job #2890614) | Profil Dobricean_Ioan | Cod sursa (job #1292725) | Cod sursa (job #542571) | Cod sursa (job #424833)
Cod sursa(job #424833)
#include <cstdio>
#include <cstring>
using namespace std;
#define inf 1<<18
#define nmax 604
FILE *f=fopen("cmcm.in","r");
FILE *fout=fopen("cmcm.out","w");
int n,m,e;
int M[nmax][nmax];
int Q[3000],k;
bool viz[nmax];
int drum[nmax],pre[nmax];
struct graf
{
int x,c;
graf *urm;
};
graf *G[nmax];
int C[nmax][nmax],F[nmax][nmax];
void add(graf *&g,int x,int c)
{
graf *p=new graf;
p->x=x;
p->c=c;
p->urm=g;
g=p;
}
void read()
{
int i,x,y,c;
fscanf(f,"%d %d %d",&n,&m,&e);
for(i=1;i<=n;i++)
{
add(G[0],i,0);
C[0][i]=1;
}
for(i=1;i<=m;i++)
{
add(G[n+i],n+m+1,0);
C[n+i][n+m+1]=1;
}
for(i=1;i<=e;i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
M[x][n+y]=i;
add(G[x],n+y,c);
add(G[n+y],x,-c);
C[x][n+y]=1;
}
}
inline int min(int x,int y)
{
if(x<y) return x;
return y;
}
bool BF()
{
k=-1;
int c=3;
int i,x;
Q[++k]=0;
for(i=0;i<=n;i++){drum[i]=inf;pre[i]=-1;}
drum[0]=0;
viz[0]=true;
for(i=0;i<=k;i++)
{
x=Q[i];
for(graf *g=G[x];g!=NULL;g=g->urm)
{
if(C[x][g->x]-F[x][g->x]>0&&drum[g->x]>drum[x]+g->c)
{
drum[g->x]=drum[x]+g->c;
pre[g->x]=x;
if(!viz[g->x])
{
viz[g->x]=true;
Q[++k]=g->x;
}
}
}
viz[x]=false;
}
for(i=n;pre[i]!=-1;i=pre[i])
c=min(c,C[pre[i]][i]-F[pre[i]][i]);
for(i=n;pre[i]!=-1;i=pre[i])
{
F[pre[i]][i]+=c;
F[i][pre[i]]-=c;
}
return drum[n]!=inf;
}
void flux()
{
bool drum=false;
do
{
drum=BF();
}while(drum);
}
void show()
{
long long cost=0;
int nv=0;
int i;
for(i=1;i<=n-m-1;i++)
for(graf *g=G[i];g!=NULL;g=g->urm)
{
if(F[i][g->x])
{
++nv;
cost+=g->c;
}
}
fprintf(fout,"%d %lld\n",nv,cost);
for(i=1;i<=n-m-1;i++)
for(graf *g=G[i];g!=NULL;g=g->urm)
{
if(F[i][g->x])
fprintf(fout,"%d ",M[i][g->x]);
}
}
int main()
{
read();
n=n+m+1;
flux();
show();
return 0;
}