Pagini recente » Cod sursa (job #1975490) | Borderou de evaluare (job #589070) | Cod sursa (job #2905256) | Cod sursa (job #2521603) | Cod sursa (job #2200404)
#include <bits/stdc++.h>
#define Nmax 603
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
int n,p,q,m,e,c,S,D,mn[Nmax],cst,ans,NR[Nmax],ant[Nmax],fw[Nmax][Nmax],C[Nmax][Nmax];
bool inQ[Nmax];
vector<pair<int,int> > v[Nmax];
void belman(){
memset(mn,0x3f,sizeof(mn));
memset(ant,0xff,sizeof(ant));
vector<int> H;
H.push_back(S);
mn[S] = 0;
for (int i=0;i<H.size();i++){
int nod = H[i];
inQ[nod] = 0;
for (auto it : v[nod]){
if (!fw[nod][it.first]) continue;
if (mn[it.first]>mn[nod]+C[nod][it.first]){
mn[it.first] = mn[nod] + C[nod][it.first];
ant[it.first] = nod;
if (!inQ[it.first]){
H.push_back(it.first);
inQ[it.first] = 1;
}
}
}
}
}
bool flow(){
if (mn[D]>1e9) return 0;
int nod = D;
while (nod!=S){
cst += C[ant[nod]][nod];
fw[ant[nod]][nod] = 0;
fw[nod][ant[nod]] = 1;
nod = ant[nod];
}
ans++;
return 1;
}
int main()
{
f>>n>>m>>e;
S = n+m+1;
D = n+m+2;
for (int i=1;i<=e;i++){
f>>p>>q>>c;
q+=n;
v[p].push_back({q,i});
fw[p][q] = 1;
C[p][q] = c;
v[q].push_back({p,-1});
fw[q][p] = 0;
C[q][p] = -c;
}
for (int i=1;i<=n;i++){
v[S].push_back({i,-1});
fw[S][i] = 1;
C[S][i] = 0;
}
for (int i=n+1;i<=n+m;i++){
v[i].push_back({D,-1});
fw[i][D] = 1;
C[i][D] = 0;
}
belman();
while(flow()){
belman();
}
g<<ans<<' '<<cst<<'\n';
for (int i=1;i<=n+m;i++){
for (auto it : v[i]){
if (!fw[i][it.first] && it.second>0) g<<it.second<<' ';
}
}
return 0;
}