Pagini recente » Cod sursa (job #2987463) | Cod sursa (job #429824) | Cod sursa (job #2462090) | Cod sursa (job #1904660) | Cod sursa (job #2395859)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int n,m,e,x,y,val,inc,sf;
int edge[605][605];
int c[605][605];
int f[605][605];
int father[605],dist[605];
bool used[605];
vector<pair<int,int> >nod[605];
int ford()
{
for(int i=inc;i<=sf;i++)
{
father[i]=0;
dist[i]=INT_MAX;
used[i]=false;
}
queue<int>q;
dist[inc]=0;
used[inc]=true;
q.push(inc);
while(!q.empty())
{
int pos=q.front();
q.pop();
for(int i=0;i<nod[pos].size();i++)
if(c[pos][nod[pos][i].first]>f[pos][nod[pos][i].first] && dist[nod[pos][i].first]>dist[pos]+nod[pos][i].second)
{
dist[nod[pos][i].first]=dist[pos]+nod[pos][i].second;
father[nod[pos][i].first]=pos;
if(!used[nod[pos][i].first])
{
used[nod[pos][i].first]=true;
q.push(nod[pos][i].first);
}
}
used[pos]=false;
}
if(dist[sf]==INT_MAX)
return 0;
int flux=INT_MAX;
for(int i=sf;i!=1;i=father[i])
flux=min(flux,c[father[i]][i]-f[father[i]][i]);
for(int i=sf;i!=1;i=father[i])
{
f[father[i]][i]+=flux;
f[i][father[i]]-=flux;
}
return flux*dist[sf];
}
int main()
{
fin>>n>>m>>e;
for(int i=1;i<=e;i++)
{
fin>>x>>y>>val;
x++;
y+=n+1;
nod[x].push_back({y,val});
nod[y].push_back({x,-val});
edge[x][y]=i;
c[x][y]=1;
}
inc=1;
sf=n+m+2;
for(int i=2;i<=n+1;i++)
{
nod[inc].push_back({i,0});
nod[i].push_back({inc,0});
c[inc][i]=1;
}
for(int i=n+2;i<sf;i++)
{
nod[sf].push_back({i,0});
nod[i].push_back({sf,0});
c[i][sf]=1;
}
int hm=1;
int ans=0;
while(hm)
{
hm=ford();
ans+=hm;
}
hm=0;
for(int i=2;i<=n+1;i++)
for(int j=n+2;j<sf;j++)
if(c[i][j] && f[i][j])
{
hm++;
break;
}
fout<<hm<<" "<<ans<<"\n";
for(int i=2;i<=n+1;i++)
for(int j=n+2;j<sf;j++)
if(c[i][j] && f[i][j])
{
fout<<edge[i][j]<<" ";
break;
}
return 0;
}