Pagini recente » Cod sursa (job #847988) | Cod sursa (job #2926120) | Cod sursa (job #1708793) | Cod sursa (job #2945055) | Cod sursa (job #611358)
Cod sursa(job #611358)
#include<stdio.h>
#include<vector>
#include<deque>
#define N 601
using namespace std;
vector<int> v[N];
deque<int> Q;
int L,R,E,P,s,d,x,y,i,Cst,e[N][N],cst[N][N],cap[N][N],q[N],p[N],c[N],T[N],oo=2000000000;
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d%d%d",&L,&R,&E);
for(i=1;i<=E;i++)
{
scanf("%d%d%d",&x,&y,&Cst);e[x][y]=i;cap[x][y+L]=1;
cst[x][y+L]=Cst;cst[y+L][x]=-Cst;
v[x].push_back(y+L);v[y+L].push_back(x);
}
for(s=0,i=1;i<=L;i++){v[s].push_back(i);cap[s][i]=1;}
for(d=L+R+1,i=1;i<=R;i++){v[i+L].push_back(d);cap[i+L][d]=1;}
for(Cst=0;;)
{
Q.resize(0);Q.push_back(s);q[s]=1;
for(i=1;i<=L+R+1;i++){c[i]=oo;T[i]=0;}
for(;Q.size();)
{
i=Q.front();
for(vector<int>::iterator j=v[i].begin();j!=v[i].end();j++)
if(cap[i][*j]&&c[*j]>c[i]+cst[i][*j])
{
c[*j]=c[i]+cst[i][*j];T[*j]=i;
if(!q[*j]){Q.push_back(*j);q[*j]=1;}
}
Q.pop_front();q[i]=0;
}
if(c[d]==oo)break;
for(x=d;x;x=T[x])
{
cap[x][T[x]]=1;cap[T[x]][x]^=1;Cst+=cst[T[x]][x];
if(T[x]<=L)p[T[x]]=x-L;
}
}
for(i=1;i<=L;i++)if(p[i])P++;
printf("%d %d\n",P,Cst);
for(i=1;i<=L;i++)if(p[i])printf("%d ",e[i][p[i]]);
return 0;
}