Pagini recente » Cod sursa (job #322536) | Cod sursa (job #841164) | Cod sursa (job #1119353) | Cod sursa (job #2429972) | Cod sursa (job #1174364)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
#define N 620
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
int n,m,k,i,mini,j,x,y,c,dest,flux,cost,cap[N][N],fl[N][N],d[N],t[N],viz[N],mu[N][N];
queue<int>q;
vector<pair<int,int > > v[N];
inline bool bellman_ford(){
memset(d,INF,sizeof(d));
memset(viz,0,sizeof(viz));
d[0] = 0;
viz[0] = 1;
q.push(0);
while(!q.empty())
{
x = q.front();
q.pop();
viz[x] = 0;
for(vector<pair<int,int> >::iterator it = v[x].begin() ; it != v[x].end() ; ++ it)
{
if(d[x] + it->second >= d[it->first] || cap[x][it->first] == fl[x][it->first])
continue;
d[it->first] = d[x] + it->second;
t[it->first] = x;
if(!viz[it->first])
{
viz[it->first] = 1;
q.push(it->first);
}
}
}
return d[dest] != INF;
}
inline void flux_maxim_de_cost_minim(){
while(bellman_ford())
{
x = dest;
mini = INF;
while(x)
{
++ fl[t[x]][x];
-- fl[x][t[x]];
x = t[x];
}
++ flux;
cost += d[dest];
}
}
int main()
{
f >> n >> m >> k;
dest = n + m + 1;
for(i = 1 ; i <= k ; ++ i)
{
f >> x >> y >> c;
y += n;
v[x].push_back(make_pair(y , c));
v[y].push_back(make_pair(x , -c));
cap[x][y] = 1;
mu[x][y] = i;
v[0].push_back(make_pair(x , 0));
cap[0][x] = 1;
v[y].push_back(make_pair(dest , 0));
cap[y][dest] = 1;
}
flux_maxim_de_cost_minim();
g << flux << ' ' << cost << '\n';
for(i = 1 ; i <= n ; ++ i)
for(j = n + 1 ; j < dest ; ++ j)
if(fl[i][j])
g << mu[i][j] << ' ';
g<<'\n';
return 0;
}