Pagini recente » Cod sursa (job #1903465) | Cod sursa (job #1193681) | Cod sursa (job #1421950) | Cod sursa (job #1316886) | Cod sursa (job #2400005)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cmcm.in");
ofstream out("cmcm.out");
int pr[602],c[602][602],a[602][602],d[2][602],cst[602],ind[602][602],D;
vector<int> v[602];
queue<int> q;
priority_queue<pair<int,int>> h;
bool dij(int k)
{
int nr1,nr2;
memset(pr,0,sizeof(pr));
memset(cst,0,sizeof(cst));
h.push({-1,0});
cst[0]=1;
d[1-k][0]=0;
while(!h.empty())
{
nr1=h.top().first;nr2=h.top().second;
cst[nr2]=-nr1;
for(auto it:v[nr2])
if(c[nr2][it]&&(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]<-cst[it]||!cst[it]))
{
cst[it]=-(cst[nr2]+a[nr2][it]+d[k][nr2]-d[k][it]);
d[1-k][it]=d[1-k][nr2]+a[nr2][it];
pr[it]=nr2;
h.push({cst[it],it});
}
while(!h.empty()&&h.top().first!=cst[h.top().second])
h.pop();
}
return cst[D];
}
int main()
{
int n1,n2,m,nr1,nr2,nr,i,j;
in>>n1>>n2>>m;
D=(n2+=n1)+1;
for(i=1;i<=m;i++)
{
in>>nr1>>nr2;
ind[nr1][nr2]=i;
nr2+=n1;
v[nr1].push_back(nr2);
v[nr2].push_back(nr1);
in>>a[nr1][nr2];
a[nr2][nr1]=-a[nr1][nr2];
c[nr1][nr2]=1;
}
for(i=1;i<=n1;i++)
{
v[0].push_back(i);
c[0][i]=1;
}
for(;i<=n2;i++)
{
v[i].push_back(D);
c[i][D]=1;
}
q.push(0);
for(i=1;i<=D;i++)
d[1][i]=1<<29;
while(!q.empty())
{
nr=q.front();
q.pop();
for(auto it:v[nr])
{
if(c[nr][it]&&d[1][nr]+a[nr][it]<d[1][it])
{
d[1][it]=d[1][nr]+a[nr][it];
if(!pr[it])
pr[it]=1,q.push(it);
}
}
pr[nr]=0;
}
nr=nr2=m=0;
while(dij(nr2=1-nr2))
{
for(nr1=1<<29,i=D;i;i=pr[i])
nr1=min(nr1,c[pr[i]][i]);
m+=nr1*d[1-nr2][D];
nr+=nr1;
for(i=D;i;i=pr[i])
c[pr[i]][i]-=nr1,c[i][pr[i]]+=nr1;
}
out<<nr<<" "<<m<<"\n";
for(i=1;i<=n1;i++)
for(j=n1+1;j<=n2;j++)
if(c[j][i]==1)
out<<ind[i][j-n1]<<" ";
return 0;
}