Pagini recente » Cod sursa (job #2359638) | Cod sursa (job #2926006) | Cod sursa (job #3183885) | Cod sursa (job #2275429) | Cod sursa (job #2466882)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
#define NMX 350
#define s n+1
#define t n+m+2
int n,m;
vector<int> v[NMX];
int F[NMX][NMX];
int Ct[NMX][NMX];
int ind[NMX][NMX];
bool inQ[NMX];
bool vis[NMX];
int dist[NMX];
int p[NMX];
int cuplaj;
long cost;
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
int e;
scanf("%d %d %d",&n,&m,&e);
for(int i=0;i<e;i++)
{
int j,k,c;
scanf("%d %d %d",&j,&k,&c);
v[j].push_back(n+k+1);
v[k+n+1].push_back(j);
F[j][k+n+1]=1;
Ct[j][k+n+1]=c;
Ct[k+n+1][j]=-c;
ind[j][k+n+1]=i;
}
for(int i=1;i<=n;i++)
{
v[s].push_back(i);
F[s][i]=1;
}
for(int i=n+2;i<=n+m+1;i++)
{
v[i].push_back(t);
F[i][t]=1;
}
while(1)
{
for(int i=1;i<=n+m+2;i++)
dist[i]=INT_MAX;
queue<int> q= queue<int>();
q.push(s);
inQ[s]=1;
dist[s]=0;
memset(vis,0,sizeof(vis));
while(!q.empty())
{
int tp = q.front();
for(vector<int>::iterator it= v[tp].begin();it!=v[tp].end();++it)
if(dist[*it]>dist[tp]+Ct[tp][*it]&&F[tp][*it])
{
dist[*it]=dist[tp]+Ct[tp][*it];
p[*it]=tp;
vis[*it]=1;
if(!inQ[*it])
{
inQ[*it]=1;
q.push(*it);
}
}
inQ[tp]=0;
q.pop();
}
if(!vis[t]) break;
for(int i=t;i!=s;i=p[i])
{
F[p[i]][i]--;
F[i][p[i]]++;
cost+=Ct[p[i]][i];
}
cuplaj++;
}
printf("%d %ld\n",cuplaj,cost);
for(int i=1;i<=n;i++)
if(!F[s][i])
for(vector<int>::iterator it=v[i].begin();it!=v[i].end();++it)
if(!F[i][*it])
printf("%d ",ind[i][*it]+1);
}