Pagini recente » Cod sursa (job #2404717) | Cod sursa (job #2529767) | Cod sursa (job #2563264) | Cod sursa (job #1852039) | Cod sursa (job #371916)
Cod sursa(job #371916)
#include<stdio.h>
#include<vector>
#include<deque>
using namespace std;
int in_Q[610],cuplaj[310],cm,dad[610],i,j,oo=1<<30,M[310][310],
e,m,n,nc,dist[610],s,d,C[610][610],D[610][610],x,y;
deque<int> Q;
vector<int> v[610];
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]==oo)break;
for(i=d;i;)
{
j=dad[i];C[i][j]=1;C[j][i]=0;
cm+=D[j][i];
if(!j)break;
if(j<=n)cuplaj[j]=i;
i=j;
}
}
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()
{
int DD;
vector<int>::iterator I;
Q.resize(0);
Q.push_back(s);in_Q[s]=1;
for(i=1;i<=d;i++){dist[i]=oo;dad[i]=0;}
while(!Q.empty())
{
i=Q.front();Q.pop_front();in_Q[i]=0;
for(I=v[i].begin();I!=v[i].end();I++)
if(C[i][*I])
{
DD=dist[i]+D[i][*I];
if(!in_Q[*I]){dist[*I]=DD;Q.push_back(*I);in_Q[*I]=1;dad[*I]=i;}
else if(DD<dist[*I]){dist[*I]=DD;dad[*I]=i;}
}
}
}