Pagini recente » Cod sursa (job #2248272) | Cod sursa (job #2668191) | Cod sursa (job #2518300) | Cod sursa (job #1316242) | Cod sursa (job #1965415)
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
const int INF=2140e6;
const int MaxN=7e2+5;
FILE *IN,*OUT;
int N,M,E,X,Y,F=0,C=0,flow[MaxN][MaxN],cap[MaxN][MaxN],Edges[MaxN][MaxN];
struct Edge
{
int node,cost;
}aux;
queue<int>Queue;
int father[MaxN],cost[MaxN];
vector<Edge>G[MaxN];
bool BFS(int Start,int End)
{
int node;
Edge to;
memset(father,0,sizeof father);
for(int i=0;i<=M+N+1;i++)
cost[i]=INF;
cost[Start]=0;
Queue.push(Start);
while(!Queue.empty())
{
node=Queue.front();
Queue.pop();
for(int i=0;i<G[node].size();i++)
{
to=G[node][i];
if(cap[node][to.node]-flow[node][to.node]>0&&cost[to.node]>cost[node]+to.cost)
cost[to.node]=cost[node]+to.cost,Queue.push(to.node),father[to.node]=node;
}
}
return cost[End]!=INF;
}
void Flow(int S,int D)
{
F=C=0;
while(BFS(S,D))
{
F++;
C+=cost[D];
for(int node=D;node!=S;node=father[node])
{
flow[father[node]][node]++;
flow[node][father[node]]--;
}
}
}
int main()
{
IN=fopen("cmcm.in","r");
OUT=fopen("cmcm.out","w");
fscanf(IN,"%d%d%d",&N,&M,&E);
for(int i=1;i<=N;i++)
{
aux.cost=0,aux.node=i;
G[0].push_back(aux);
aux.node=0;
G[i].push_back(aux);
cap[0][i]=1;
}
for(int i=N+1;i<=N+M;i++)
{
aux.cost=0,aux.node=N+M+1;
cap[i][N+M+1]=1;
G[i].push_back(aux);
aux.node=i;
G[M+N+1].push_back(aux);
}
for(int i=1;i<=E;i++)
{
fscanf(IN,"%d%d%d",&X,&Y,&C);
Y+=N;
Edges[X][Y]=i;
aux.cost=C,aux.node=Y;
cap[X][Y]=1;
G[X].push_back(aux);
aux.cost=-C,aux.node=X;
G[Y].push_back(aux);
}
Flow(0,N+M+1);
fprintf(OUT,"%d %d\n",F,C);
for(int i=1;i<=M+N;i++)
for(int j=1;j<=M+N;j++)
if(cap[i][j]&&flow[i][j])
fprintf(OUT,"%d ",Edges[i][j]);
return 0;
}