Pagini recente » Cod sursa (job #1805246) | Cod sursa (job #2368431) | Cod sursa (job #1180821) | Cod sursa (job #2841565) | Cod sursa (job #460475)
Cod sursa(job #460475)
#include<fstream.h>
#include<vector>
using namespace std;
int sol=0,cost[700][700],flux[700][700],best[1000],C[100000],n,m,S,D,sw[1000],inf,t[1000],nr,muchie[300][300],psol[1000];
vector <int> v[800];
void afisare ()
{
int i;
vector<int> :: iterator it;
ofstream g("cmcm.out");
g<<nr<<' '<<sol<<"\n";
for (i=n+1;i<=n+m;i++)
if (psol[i]!=0)
g<<muchie[i-n][psol[i]]<<' ';
g.close();
}
int fmax ()
{
vector<int> :: iterator it;
int p,u,i;
p=u=1;
C[p]=S;
memset(sw,0,sizeof(sw));
sw[S]=1;
for (i=1;i<=n+m;i++)
best[i]=inf;
best[D]=inf;
while (p<=u)
{
for (it=v[C[p]].begin();it<v[C[p]].end();++it)
if (flux[C[p]][*it]<=0 && best[*it]>best[C[p]]+cost[C[p]][*it])
{
t[*it]=C[p];
best[*it]=best[C[p]]+cost[C[p]][*it];
C[++u]=*it;
}
++p;
}
if (best[D]!=inf)
{
p=D;
sol+=best[D];
while (p!=S)
{
flux[p][t[p]]--;
flux[t[p]][p]++;
p=t[p];
psol[p]=t[p];
}
return 1;
}
return 0;
}
void getflux()
{
int fl=1;
nr=-1;
while (fl)
{
++nr;
fl=fmax();
}
}
void citire ()
{
int i,j,e,a,b,c;
ifstream f("cmcm.in");
f>>n>>m>>e;
for (i=1;i<=e;i++)
{
f>>a>>b>>c;
muchie[b][a]=muchie[a][b]=i;
cost[a][b+n]=c;
cost[b+n][a]=-c;
v[a].push_back(b+n);
v[b+n].push_back(a);
}
S=n+m+1;
D=S+1;
for (i=1;i<=n;i++)
{
v[S].push_back(i);
cost[S][i]=0;
}
for (i=n+1;i<=n+m;i++)
{
v[i].push_back(D);
cost[i][D]=0;
}
f.close();
}
int main()
{
inf =2000000000;
citire ();
getflux();
afisare ();
return 0;
}