Pagini recente » Cod sursa (job #559048) | Cod sursa (job #401865) | Cod sursa (job #2913169) | Cod sursa (job #1554721) | Cod sursa (job #372719)
Cod sursa(job #372719)
using namespace std;
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define MAX_N 606
#define INF 0x3f3f3f3f
int N, M, L;
vector<int>G[MAX_N];
int capac[MAX_N][MAX_N];
int cst[MAX_N][MAX_N];
int nr_ord[MAX_N][MAX_N];
int tata[MAX_N];
char viz[MAX_N];
queue<int>Q;
int cstmin;
int d[MAX_N],S,D;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
bool BFS()
{
int x, y;
unsigned i;
Q.push(S);
memset(d,INF,sizeof(d));
memset(viz,0,sizeof(viz));
d[S] = 0; viz[S] = 1; tata[S] = 0;
for(;!Q.empty(); Q.pop())
{
x = Q.front(); viz[x] = 0;
for( i = 0 ; i < G[x].size(); ++i)
{
y = G[x][i];
if(capac[x][y] && d[y] > d[x] + cst[x][y])
{
d[y] = d[x] + cst[x][y];
tata[y] = x;
if(viz[y] == 1) continue;
Q.push(y);
viz[y] = 1;
}
}
}
if(d[D] == INF) return 0;
return 1;
}
void FLUX()
{
int i, flux;
for(;BFS();)
{
flux = INF;
for( i = D; i!=S; i = tata[i])
flux = min(flux, capac[tata[i]][i]);
for( i = D; i!=S; i = tata[i])
{
capac[tata[i]][i] -= flux;
capac[i][tata[i]] += flux;
}
cstmin += flux * d[D];
}
}
int main()
{
f>>N>>M>>L;
int i,x,y,c,j, sol = 0;
S = 0, D = N + M + 1;
for(i = 1; i <= L; ++i)
{
f>>x>>y>>c;
y += N;
G[x].push_back(y); G[y].push_back(x);
cst[x][y] = c; cst[y][x] = -c;
capac[x][y] = 1;
nr_ord[x][y] = i;
}
for(i = 1; i <= N; ++i)
{
G[S].push_back(i);
G[i].push_back(S);
capac[S][i] = 1;
}
for(i = N+1; i <= M + N; ++i)
{
G[D].push_back(i);
G[i].push_back(D);
capac[i][D] = 1;
}
FLUX();
for(i = 1; i <= N; ++i)
for(j = N+1; j<= M+N; ++j)
if(nr_ord[i][j] && capac[i][j] == 0) { ++sol; break; }
g<<sol<<" "<<cstmin<<"\n";
for(i = 1; i <= N; ++i)
for(j = N+1; j<= M+N; ++j)
if(nr_ord[i][j] && capac[i][j] == 0) g<<nr_ord[i][j]<<" ";
return 0;
}