Pagini recente » Cod sursa (job #1885934) | Cod sursa (job #2770244) | Cod sursa (job #493204) | Cod sursa (job #39907) | Cod sursa (job #430100)
Cod sursa(job #430100)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
int in_Q[610],cuplaj[310],cm,dad[610],i,j,inf=1<<30,M[310][310],e,m,n,nc,dist[610],s,d,C[610][610],D[610][610],x,y;
queue<int> Q;
vector<int> v[10];
void read(),solve(),bellman_ford();
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d%d%d",&n,&m,&e);
for(i=1;i<=e;i++)
{
scanf("%d%d%d",&x,&y,&d);
v[x].push_back(y+n);
v[y+n].push_back(x);
D[x][y+n]=d;D[y+n][x]=-d;
C[x][y+n]=1;
M[x][y]=i;
}
}
void solve()
{
s=0;d=n+m+1;
for(i=1;i<=n;i++)
{
v[s].push_back(i);
C[s][i]=1;
}
for(i=n+1;i<=n+m;i++)
{
v[i].push_back(d);
C[i][d]=1;
}
for(;;)
{
bellman_ford();
if(dist[d]==inf)break;
for(i=d;i;i=dad[i])
{
C[i][dad[i]]=1;C[dad[i]][i]=0;
cm+=D[dad[i]][i];
if(!dad[i])break;
if(dad[i]<=n)cuplaj[dad[i]]=i;
}
}
for(i=1;i<=n;i++)
if(cuplaj[i])
{
nc++;
cuplaj[i]-=n;
}
printf("%d %d\n",nc,cm);
for(i=1;i<=n;i++)
if(cuplaj[i])
printf("%d ",M[i][cuplaj[i]]);
}
void bellman_ford()
{
vector<int>::iterator I;
queue<int> Q;
Q.push(s);in_Q[s]=1;
for(i=1;i<=d;i++)
{
dist[i]=inf;
dad[i]=0;
}
while(!Q.empty())
{
i=Q.front();Q.pop();in_Q[i]=0;
for(I=v[i].begin();I!=v[i].end();I++)
if(C[i][*I]&&dist[i]+D[i][*I]<dist[*I])
{
dist[*I]=dist[i]+D[i][*I];
dad[*I]=i;
if(!in_Q[*I]){Q.push(*I);in_Q[*I]=1;dad[*I]=i;}
}
}
}