Pagini recente » Cod sursa (job #675476) | Cod sursa (job #174453) | Cod sursa (job #1722510) | Cod sursa (job #2295793) | Cod sursa (job #1955593)
#include <bits/stdc++.h>
#define NMAX 610
#define INF 2000000000
#define SRC 0
#define SINK n+m+1
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int n,m,s,d,ok,e;
vector<int> g[NMAX];
int f[NMAX][NMAX],c[NMAX][NMAX],cost[NMAX][NMAX],muchie[NMAX][NMAX];
int dist[NMAX],parent[NMAX];
bitset<NMAX> inQ;
queue<int> Q;
void read() {
fin>>n>>m>>e;
for(int i=1; i<=e; i++) {
int x,y,w;
fin>>x>>y>>w;
g[x].push_back(y+n);
g[y+n].push_back(x);
c[x][y+n]=1;
cost[x][y+n]=w;
cost[y+n][x]=-w;
muchie[x][y+n]=i;
}
for(int i=1; i<=n; i++) {
g[SRC].push_back(i);
g[i].push_back(SRC);
c[SRC][i]=1;
}
for(int i=n+1; i<=n+m; i++) {
g[i].push_back(SINK);
g[SINK].push_back(i);
c[i][SINK]=1;
}
}
int bellman() {
fill(dist+SRC,dist+SINK+1,INF);
fill(parent+SRC,parent+SINK+1,INF);
Q.push(SRC);
inQ.reset();
dist[SRC]=0;
inQ[SRC]=1;
for(; Q.size(); Q.pop()) {
int aux=Q.front();
inQ[aux]=0;
for(auto q:g[aux]) {
if(c[aux][q]-f[aux][q]>0&&dist[q]>dist[aux]+cost[aux][q]) {
parent[q]=aux;
dist[q]=dist[aux]+cost[aux][q];
if(!inQ[q]) {
inQ[q]=1;
Q.push(q);
}
}
}
}
if(dist[SINK]!=INF) {
ok=1;
for(int i=SINK; i!=SRC; i=parent[i]) {
f[parent[i]][i]++;
f[i][parent[i]]--;
}
return dist[SINK];
}
return 0;
}
int main() {
read();
ok=1;
int64_t result=0;
while(ok) {
ok=0;
result+=bellman();
}
int cuplaj=0;
vector<int> selectedEdges;
for(int i=1; i<=n; i++) for(auto q:g[i]) {
if(q==SRC) continue;
if(f[i][q])
{
cuplaj++;
selectedEdges.push_back(muchie[i][q]);
}
}
fout<<cuplaj<<' '<<result<<'\n';
for(auto q:selectedEdges) fout<<q<<' ';
return 0;
}