Pagini recente » Cod sursa (job #2597214) | Plantatie | Cod sursa (job #2269909) | Cod sursa (job #1173241) | Cod sursa (job #931930)
Cod sursa(job #931930)
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
#define max 710
#define inf 2000000000
int Q[max*max],dad[max],dist[max],used[max];
int C[max][max],f[max][max],edge[max][max];
int n,m,e,dest,sol,nr,imp;
vector<int> v[max],cost[max];
void getemgoin()
{
dest=n+m+2;
for(int i=2;i<=n+1;i++)
{
v[1].push_back(i); cost[1].push_back(0);
v[i].push_back(1); cost[i].push_back(0);
C[1][i]=1;
}
for(int i=n+2;i<=n+m+1;i++)
{
v[i].push_back(dest); cost[i].push_back(0);
v[dest].push_back(i); cost[dest].push_back(0);
C[i][dest]=1;
}
}
int bellman()
{
for (int i = 1; i <= dest; i++) {
dist[i] = inf;
dad[i] = -1;
used[i] = 0;
}
dist[1] = 0; used[1] = 1;
int st = 0, dr = 1; Q[1] = 1;
while (st < dr) {
st++;
int len = v[Q[st]].size();
for (int i = 0; i < len; i++) {
if (C[Q[st]][v[Q[st]][i]] > f[Q[st]][v[Q[st]][i]] && dist[v[Q[st]][i]] > dist[Q[st]] + cost[Q[st]][i]) {
dist[v[Q[st]][i]] = dist[Q[st]] + cost[Q[st]][i];
dad[v[Q[st]][i]] = Q[st];
if (!used[v[Q[st]][i]]) {
Q[++dr] = v[Q[st]][i];
used[v[Q[st]][i]] = 1;
}
}
}
used[Q[st]] = 0;
}
if (dist[dest] < inf) {
int flux = inf;
for (int i = dest; i != 1; i = dad[i])
flux = min(flux, C[dad[i]][i] - f[dad[i]][i]);
for (int i = dest; i != 1; i = dad[i]) {
f[dad[i]][i] += flux;
f[i][dad[i]] -= flux;
}
return flux * dist[dest];
}
return 0;
}
void ShitStorm()
{
getemgoin();
imp=1;
while(imp)
{
imp=bellman();
sol+=imp;
}
}
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
b+=n+1;a++;
v[a].push_back(b); cost[a].push_back(c);
v[b].push_back(a); cost[b].push_back(-c);
edge[a][b]=i;
C[a][b]=1;
}
ShitStorm();
for(int i=2;i<=n+1;i++)
for(int j=n+2;j<dest;j++)
if(C[i][j] && f[i][j])
{
nr++;
break;
}
printf("%d %d\n", nr,sol);
for(int i=2;i<=n+1;i++)
for(int j=n+2;j<dest;j++)
if(C[i][j] && f[i][j])
{
printf("%d ",edge[i][j]);
break;
}
printf("\n");
}