Pagini recente » Cod sursa (job #1717599) | Cod sursa (job #2718302) | Cod sursa (job #1449129) | Cod sursa (job #981008) | Cod sursa (job #1519459)
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
#define nmax 620
#define emax 50005
#define inf (1<<30)
using namespace std;
int n,m,e;
int f[nmax][nmax],c[nmax][nmax],r[nmax][nmax];
int z[nmax][nmax],dest,grow;
int t[nmax],d[nmax],sol,nr;
vector <int> v[nmax];
bitset <nmax> in;
queue <int> q;
int bellmanford()
{
int i,j,k;
in.reset();
d[0]=0;t[0]=0;
for (i=1;i<=dest;i++)
d[i]=inf;
q.push(0);in[0]=1;
while (!q.empty()) {
i=q.front();
q.pop();
in[i]=0;
for (j=0;j<v[i].size();j++) {
k=v[i][j];
if (d[k]>d[i]+z[i][k]&&c[i][k]>f[i][k]) {
d[k]=d[i]+z[i][k];
t[k]=i;
if (in[k]==0) {
in[k]=1;
q.push(k);
}
}
}
}
if (d[dest]==inf)
return 0;
return 1;
}
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d %d %d",&n,&m,&e);
dest=n+m+1;
int i,j,a,b,h;
for (i=1;i<=e;i++) {
scanf("%d %d %d",&a,&b,&h);
b+=n;
v[a].push_back(b);
v[b].push_back(a);
c[a][b]=1;
r[a][b]=i;
z[a][b]=h;z[b][a]=-h;
}
for (i=1;i<=n;i++) {
v[0].push_back(i);
v[i].push_back(0);
c[0][i]=1;
}
for (i=1;i<=m;i++) {
v[i+n].push_back(dest);
v[dest].push_back(i+n);
c[i+n][dest]=1;
}
while (bellmanford()) {
sol+=d[dest];
nr++;
for (i=dest;i;i=t[i]) {
f[t[i]][i]++;
f[i][t[i]]--;
}
}
printf("%d %d\n",nr,sol);
for (i=1;i<=n;i++)
for (j=n+1;j<=n+m;j++)
if (f[i][j]==1)
printf("%d ",r[i][j]);
return 0;
}