Pagini recente » Cod sursa (job #1899305) | Cod sursa (job #2038324) | Cod sursa (job #643321) | Cod sursa (job #2237144) | Cod sursa (job #1143195)
#include<fstream>
#include<vector>
#define MAXN 710
#define INF 2000000000
using namespace std;
int N,M,Nrmuchii,Capacitate[MAXN][MAXN],Flux[MAXN][MAXN],Muchie[MAXN][MAXN];
int Dist[MAXN],Queue[MAXN*MAXN],Use[MAXN],Tata[MAXN];
int SolFlux,SolNr,Size;
vector <int> v[MAXN],cost[MAXN];
void citire() {
ifstream in("cmcm.in");
int x,y,val,i;
in>>N>>M>>Nrmuchii;
for(i=1;i<=Nrmuchii;i++) {
in>>x>>y>>val;
v[x+1].push_back(y+N+1);
v[y+N+1].push_back(x+1);
cost[x+1].push_back(val);
cost[y+N+1].push_back(-val);
Capacitate[x+1][y+N+1]=1;
Muchie[x+1][y+N+1]=i;
}
in.close();
}
void AdaugareCapeti() {
int i,j;
for(i=2;i<=N+1;i++){
v[1].push_back(i);
v[i].push_back(1);
cost[i].push_back(0);
cost[1].push_back(0);
Capacitate[1][i]=1;
}
for(j=N+2;j<=N+M+1;j++){
v[j].push_back(N+M+2);
cost[j].push_back(0);
cost[N+M+2].push_back(0);
v[N+M+2].push_back(j);
Capacitate[j][N+M+2]=1;
}
}
int Bellmanford() {
int i,j,st,dr;
for(i=1;i<=N+M+2;i++) {
Dist[i]=INF;
Use[i]=0;
Tata[i]=-1;
}
Dist[1]=0;
Use[1]=1;
Queue[1]=1;
st=0;dr=1;
while(st<dr) {
st++;
Size=v[Queue[st]].size();
for(i=0;i<Size;i++) {
if( (Capacitate[Queue[st]][v[Queue[st]][i]]>Flux[Queue[st]][v[Queue[st]][i]]) && (Dist[v[Queue[st]][i]]>Dist[Queue[st]]+cost[Queue[st]][i]) ) {
Dist[v[Queue[st]][i]]=Dist[Queue[st]]+cost[Queue[st]][i];
Tata[v[Queue[st]][i]]=Queue[st];
if(!Use[v[Queue[st]][i]]) {
dr++;
Queue[dr]=v[Queue[st]][i];
Use[v[Queue[st]][i]]=1;
}
}
}
Use[Queue[st]]=0;
}
if(Dist[N+M+2]<INF) {
int flux=INF;
for(i=N+M+2;i!=1;i=Tata[i])
flux=min(flux,Capacitate[Tata[i]][i]-Flux[Tata[i]][i]);
for(i=N+M+2;i!=1;i=Tata[i]){
Flux[Tata[i]][i]+=flux;
Flux[i][Tata[i]]-=flux;
}
return flux*Dist[N+M+2];
}
return 0;
}
void solve() {
int i,j,ok;
AdaugareCapeti();
ok=1;
while(ok) {
ok=Bellmanford();
SolFlux+=ok;
}
for(i=2;i<=N+1;i++)
for(j=N+2;j<=N+M+2;j++)
if(Capacitate[i][j]&&Flux[i][j]){
SolNr++;
break;
}
}
void afisare(){
ofstream out("cmcm.out");
int i,j;
out<<SolNr<<' '<<SolFlux<<'\n';
for(i=2;i<=N+1;i++)
for(j=N+2;j<N+M+2;j++)
if(Capacitate[i][j]&&Flux[i][j]){
out<<Muchie[i][j]<<' ';
break;
}
out<<'\n';
out.close();
}
int main() {
citire();
solve();
afisare();
return 0;
}