Pagini recente » Cod sursa (job #2185052) | Cod sursa (job #2020051) | Cod sursa (job #1139941) | Cod sursa (job #3129184) | Cod sursa (job #744244)
Cod sursa(job #744244)
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int na,nb,m,S,D,C[610][610],F[610][610],viz[610],maxflow,ind[610][610];
int cost[610][610],sol;
vector <int> G[610],muchii;
void Citire()
{
int i,x,y,c;
ifstream fin("cmcm.in");
fin>>na>>nb>>m;
S=na+nb+1;
D=na+nb+2;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
G[x].push_back(na+y);
G[na+y].push_back(x);
C[x][na+y]=1;
cost[x][na+y]=c;
cost[na+y][x]=-c;
ind[x][na+y]=i;
}
fin.close();
}
void Construire_Retea_Transport()
{
int i;
for(i=1;i<=na;i++)
{
G[S].push_back(i);
G[i].push_back(S);
C[S][i]=1;
cost[S][i]=cost[i][S]=0;
}
for(i=1;i<=nb;i++)
{
G[na+i].push_back(D);
G[D].push_back(na+i);
C[na+i][D]=1;
cost[na+i][D]=cost[D][na+i]=0;
}
}
bool BFS()
{
int i,x;
int dist[610];
queue <int> Q;
vector <int>::iterator it;
for(i=1;i<=D;i++)
{
dist[i]=2000000000;
viz[i]=0;
}
Q.push(S);
viz[S]=0;
dist[S]=0;
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(it=G[x].begin();it!=G[x].end();it++)
{
if(C[x][*it]>F[x][*it] && dist[*it]>dist[x]+cost[x][*it])
{
dist[*it]=dist[x]+cost[x][*it];
viz[*it]=x;
Q.push(*it);
}
}
}
if(viz[D]==0)
return false;
return true;
}
void Max_Flow()
{
int x,val;
while(1)
{
if(BFS()==false)
return;
val=2000000000;
x=D;
while(viz[x])
{
val=min(val,C[viz[x]][x]-F[viz[x]][x]);
x=viz[x];
}
x=D;
while(viz[x])
{
F[viz[x]][x]+=val;
F[x][viz[x]]-=val;
x=viz[x];
}
maxflow+=val;
}
}
void Determinare_Solutie()
{
int i;
vector <int>::iterator it;
for(i=1;i<=na;i++)
{
for(it=G[i].begin();it!=G[i].end();it++)
{
if(F[i][*it]>0)
{
sol+=cost[i][*it];
muchii.push_back(ind[i][*it]);
}
}
}
}
void Afisare()
{
int nr=muchii.size();
vector <int>::iterator it;
ofstream fout("cmcm.out");
fout<<nr<<' '<<sol<<"\n";
for(it=muchii.begin();it!=muchii.end();it++)
fout<<*it<<' ';
fout<<"\n";
fout.close();
}
int main()
{
Citire();
Construire_Retea_Transport();
Max_Flow();
Determinare_Solutie();
Afisare();
return 0;
}