Pagini recente » Cod sursa (job #1128723) | Cod sursa (job #169273) | Cod sursa (job #2436407) | Cod sursa (job #850779) | Cod sursa (job #2111601)
#include<fstream>
#include<queue>
#define DN 605
#define pb push_back
#define x first
#define y second
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int dist[DN],n,m,e,p,qu,f[DN][DN],cap[DN][DN],cost,dest,nod,inq[DN],pr[DN],mi,rez;
typedef pair<int,int> pii;
int a[DN][DN],nr;
vector<int>k;
vector<pii >v[DN];
queue<int>q;
int bf()
{
for(int i=2;i<=dest;i++)
dist[i]=(1<<30);
q.push(1);
inq[1]=1;
while(!q.empty())
{
nod=q.front();
q.pop();
inq[nod]=0;
for(auto i:v[nod])
if(f[nod][i.x]<cap[nod][i.x])
if(dist[nod]+i.y<dist[i.x])
{
dist[i.x]=dist[nod]+i.y;
pr[i.x]=nod;
if(inq[i.x]==0)
q.push(i.x);
inq[i.x]=1;
}
}
if(dist[dest]==(1<<30))
return 0;
nod=dest;
//fout<<dist[dest]<<' '<<pr[dest]<<' '<<pr[pr[dest]]<<' '<<pr[pr[pr[dest]]]<<'\n';
mi=(1<<28);
while(nod!=1)
{
mi=min(mi,cap[pr[nod]][nod]-f[pr[nod]][nod]);
nod=pr[nod];
}
rez+=dist[dest]*mi;
nod=dest;
while(nod!=1)
{
mi=min(mi,cap[pr[nod]][nod]-f[pr[nod]][nod]);
f[pr[nod]][nod]+=mi;
f[nod][pr[nod]]-=mi;
nod=pr[nod];
}
return 1;
}
int main()
{
fin>>n>>m>>e;
for(int i=1;i<=e;i++)
{
fin>>p>>qu>>cost;
p++;
qu+=n+1;
a[p][qu]=i;
v[p].pb({qu,cost});
v[qu].pb({p,-cost});
cap[p][qu]=1;
}
for(int i=2;i<=n+1;i++)
{
cap[1][i]=1;
v[1].pb({i,0});
v[i].pb({1,0});
}
for(int i=n+2;i<=n+m+1;i++)
{
cap[i][n+m+2]=1;
v[i].pb({n+m+2,0});
v[n+m+2].pb({i,0});
}
dest=n+m+2;
while(bf());
for(int i=2;i<=n+1;i++)
for(int j=n+2;j<dest;j++)
if(f[i][j]&&cap[i][j])
{
nr++;
k.pb(a[i][j]);
}
fout<<nr<<' '<<rez<<'\n';
for(auto i:k)
fout<<i<<' ';
}