Pagini recente » Cod sursa (job #2850709) | Cod sursa (job #1508641) | Cod sursa (job #1049977) | Cod sursa (job #287937) | Cod sursa (job #769292)
Cod sursa(job #769292)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define MAX 605
#define INF 0x3f3f3f3f
using namespace std;
vector< pair < int , int > > v[MAX];
vector< pair < int , int > > muchii;
pair< int , int > cf[MAX][MAX];
int dist[MAX], inQueue[MAX], dad[MAX]; queue<int> q;
int n, m, e, s, d;
int bellmanFord()
{
memset(inQueue, 0, MAX * sizeof(int));
memset(dad, 0, MAX * sizeof(int));
memset(dist, INF, MAX * sizeof(int));
dist[s] = 0; q.push(s); inQueue[s] = 1;
int nod, dst;
while(!q.empty())
{
nod = q.front(); q.pop(); inQueue[nod] = 0;
for(int i = 0; i < v[nod].size(); i++)
{
dst = v[nod][i].first;
if(cf[nod][dst].first != cf[nod][dst].second && dist[dst] > dist[nod] + v[nod][i].second)
{
dist[dst] = dist[nod] + v[nod][i].second;
dad[dst] = nod;
if(!inQueue[dst])
{
q.push(dst); inQueue[dst] = 1;
}
}
}
}
if(dist[d] != INF)
{
int nod = d;
while(nod != s)
{
cf[dad[nod]][nod].second++;
cf[nod][dad[nod]].second--;
nod = dad[nod];
}
return dist[d];
}
return 0;
}
pair<int, int> cuplaj()
{
int c = 0, rep = 0, val;
while((val = bellmanFord()) != 0)
{
c += val;
rep++;
}
return make_pair(rep, c);
}
int main()
{
int a, b, c;
ifstream in("cmcm.in"); in>>n>>m>>e;
for(int i = 1; i <= e; i++)
{
in>>a>>b>>c; b += n;
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, -c));
cf[a][b] = make_pair(1, 0); cf[b][a] = make_pair(0, 0);
muchii.push_back(make_pair(a, b));
}
in.close();
s = 0; d = n + m + 1;
for(int i = 1; i <= n; i++)
{
v[s].push_back(make_pair(i, 0)); v[i].push_back(make_pair(s, 0));
cf[s][i] = make_pair(1, 0); cf[i][s] = make_pair(0,0);
}
for(int i = n + 1; i <= m + n; i++)
{
v[i].push_back(make_pair(d, 0)); v[d].push_back(make_pair(i, 0));
cf[i][d] = make_pair(1, 0); cf[d][i] = make_pair(0, 0);
}
pair< int , int > rez = cuplaj();
ofstream out("cmcm.out"); out<<rez.first<<" "<<rez.second<<'\n';
for(int i = 0; i < muchii.size(); i++)
{
if(cf[muchii[i].first][muchii[i].second].second == 1) out<<i + 1<<" ";
}
out.close();
return 0;
}