Pagini recente » Borderou de evaluare (job #2422953) | Borderou de evaluare (job #2949108) | Borderou de evaluare (job #2984832) | Borderou de evaluare (job #3281377) | Cod sursa (job #3304841)
#include <bits/stdc++.h>
using namespace std;
#define ST_DIO 0
#if ST_DIO
#define fin cin
#define fout cout
#else
ifstream fin("txt.in");
ofstream fout("txt.out");
#endif // ST_DIO
const int INF = 1e9 + 7;
struct Muchie {
int vec, cost;
};
int n, m, mch, i, j, st, sf, flux[62][62], rasp, idx[62][62];
int tata[62], cost[62];
vector<Muchie> gr[62];
set<int> traseu;
bool fr[62];
static inline bool Dijkastra() {
for(int i = st; i <= sf; i++) cost[i] = INF;
memset(fr, false, sizeof(fr));
queue<int> q;
cost[st] = 0;
fr[st] = true;
q.push(st);
while(!q.empty()) {
int nod = q.front();
q.pop();
fr[nod] = false;
for(Muchie urm : gr[nod]) {
int costUrm = urm.cost + cost[nod];
if(costUrm < cost[urm.vec] && flux[nod][urm.vec] > 0) {
cost[urm.vec] = costUrm;
tata[urm.vec] = nod;
if(!fr[urm.vec]) {
fr[urm.vec] = true;
q.push(urm.vec);
}
}
}
}
return cost[sf] != INF;
}
static inline void BackTrack() {
int cur = sf;
int ma = 1;
/*while(cur != st) {
ma = min(ma, flux[tata[cur]][cur]);
cur = tata[cur];
}*/
while(cur != st) {
flux[tata[cur]][cur] -= ma;
flux[cur][tata[cur]] += ma;
int i = idx[tata[cur]][cur];
if(i > 0) traseu.insert(i);
else traseu.erase(-i);
cur = tata[cur];
}
rasp += cost[sf];
}
int main() {
if(ST_DIO) ios_base::sync_with_stdio(false);
fin.tie(nullptr);
fout.tie(nullptr);
fin >> n >> m >> mch;
st = 0;
sf = n + m + 1;
for(i = 1; i <= mch; i++) {
int x, y, c;
fin >> x >> y >> c;
y += n;
gr[x].push_back({y, c});
gr[y].push_back({x, -c});
idx[x][y] = i;
idx[y][x] = -i;
flux[x][y] = 1;
}
for(i = 1; i <= n; i++) {
gr[st].push_back({i, 0});
gr[i].push_back({st, 0});
flux[st][i] = 1;
}
for(i = n + 1; i <= n + m; i++) {
gr[i].push_back({sf, 0});
gr[sf].push_back({i, 0});
flux[i][sf] = 1;
}
while(Dijkastra()) BackTrack();
fout << traseu.size() << " " << rasp << "\n";
for(int cur : traseu) fout << cur << " ";
return 0;
}