Pagini recente » Cod sursa (job #822755) | Cod sursa (job #653639) | Cod sursa (job #2234388) | Cod sursa (job #2788570) | Cod sursa (job #782074)
Cod sursa(job #782074)
#include<stdio.h>
#define inf 1000000000
typedef struct celula{
int nod;
celula *next;
}*lista;
typedef struct w{short x,y;}muchie;
muchie a[50001];
lista graf[601],v,f;
int e,sol,dist[601],dep[301],i;
int tata[601],cost[601][601],n,m,coada[100000],cap[601][601];
bool ok,viz[601];
inline void ford(){
for (i=1; i<=n+m+1; ++i) { dist[i]=inf; viz[i]==0; }
int st=0,sf=0; coada[st]=0; viz[0]=1;
while (st<=sf) {
for (lista p=graf[coada[st]];p; p=p->next)
if ( cap[coada[st]][p->nod]==1&&dist[coada[st]]+cost[coada[st]][p->nod]<dist[p->nod] ){
dist[p->nod]=dist[coada[st]]+cost[coada[st]][p->nod];
tata[p->nod]=coada[st];
if (viz[p->nod]==0) { ++sf; coada[sf]=p->nod; viz[p->nod]=true; }
}
viz[coada[st]]=0; ++st;
}
if (dist[n+m+1]==inf) ok=false;
else {
short nod=n+m+1; sol+=dist[n+m+1];
while (tata[nod]!=nod){
cap[tata[nod]][nod]-=1;
cap[nod][tata[nod]]+=1;
nod=tata[nod];
}
}
}
int main(void){
freopen("cmcm.in", "r", stdin);
freopen("cmcm.out", "w", stdout);
scanf("%d %d %d", &n, &m, &e); int x,y,c,nr=0;
for (i=1; i<=e; ++i){
scanf("%d %d %d", &x, &y, &c); y+=n; cost[x][y]=c; cost[y][x]=-c; cap[x][y]=1;
v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
v=new celula; v->nod=x; v->next=graf[y]; graf[y]=v;
a[i].x=x; a[i].y=y;
}
// adaug sursa
for (i=1; i<=n; ++i){
cap[0][i]=1;
v=new celula; v->nod=0; v->next=graf[i]; graf[i]=v;
v=new celula; v->nod=i; v->next=graf[0]; graf[0]=v;
}
//adaug destinatia
for (i=1; i<=m; ++i){
cap[i+n][n+m+1]=1;
v=new celula; v->nod=i+n; v->next=graf[n+m+1]; graf[n+m+1]=v;
v=new celula; v->nod=n+m+1; v->next=graf[i+n]; graf[i+n]=v;
}
ok=true;
while (ok==true)ford();
for (i=1; i<=e; ++i)
if (cap[a[i].x][a[i].y]==false){++nr; dep[nr]=i; }
printf("%d %d\n", nr, sol);
for (i=1; i<=nr; ++i) printf("%d ", dep[i]);
return(0);
}