Pagini recente » Cod sursa (job #243438) | Cod sursa (job #1990041) | Cod sursa (job #1839730) | Cod sursa (job #2058027) | Cod sursa (job #1564048)
#include<cstdio>
#include<deque>
#include<algorithm>
#include<vector>
const int nmax=600,add=300;
const int mmax=12500;
const int inf=2000000000;
using namespace std;
int s,t;
int flux[nmax+5][nmax+5],re[nmax+5][nmax+5];
int ca[nmax+5][nmax+5],co[nmax+5][nmax+5],ta[nmax+5],cv[nmax+5];
deque<int> que;
bool be[nmax+5],inq[nmax+5];
vector<int > ve[nmax+5];
bool belman()
{
int x,i;
for(i=0; i<=nmax+1; i++)
cv[i]=2000000000;
cv[s]=0;
que.push_back(s);
inq[s]=1;
while(!que.empty())
{
x=que.front();
for(i=ve[x].size()-1; i>=0; i--)
if(ca[x][ve[x][i]]-flux[x][ve[x][i]]>0 && cv[x]+co[x][ve[x][i]]<cv[ve[x][i]])
{
cv[ve[x][i]]=cv[x]+co[x][ve[x][i]];
ta[ve[x][i]]=x;
if(inq[ve[x][i]]==0)
{
inq[ve[x][i]]=1;
que.push_back(ve[x][i]);
}
}
inq[x]=0;
que.pop_front();
}
if(ta[t]!=-1)
return 1;
else
return 0;
}
void da()
{
int i,cmin,z;
for(i=0; i<=nmax+1; i++)
ta[i]=-1;
// i=0;
while(belman())
{
cmin=-1;
z=t;
while(z!=s)
{
if(ca[ta[z]][z]-flux[ta[z]][z]<cmin || cmin==-1)
cmin=ca[ta[z]][z]-flux[ta[z]][z];
z=ta[z];
}
z=t;
while(z!=s)
{
flux[ta[z]][z]+=cmin;
flux[z][ta[z]]-=cmin;
z=ta[z];
}
for(i=0; i<=nmax+1; i++)
ta[i]=-1;
}
}
int main()
{
freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
int i,j,x,y,cmin,p,q,e,n,m,nr=0;
scanf("%d%d%d",&n,&m,&e);
for(i=1; i<=e; i++)
{
scanf("%d%d",&x,&y);
y=y+add;
ca[x][y]=1;
re[x][y]=i;
scanf("%d",&co[x][y]);
co[y][x]=-co[x][y];
ve[x].push_back(y);
ve[y].push_back(x);
}
s=0;
t=nmax+1;
for(i=1;i<=n;i++)
{
ve[s].push_back(i);
ca[s][i]=1;
co[s][i]=0;
}
for(i=1;i<=m;i++)
{
ve[i+add].push_back(t);
ca[i+add][t]=1;
co[i+add][t]=0;
}
da();
cmin=0;
for(i=1; i<=nmax; i++)
for(j=1; j<=nmax; j++)
if(flux[i][j]>0)
{
nr++;
cmin=cmin+flux[i][j]*co[i][j];
}
printf("%d %d\n",nr,cmin);
for(i=1; i<=nmax; i++)
for(j=1; j<=nmax; j++)
if(flux[i][j]>0)
printf("%d ",re[i][j]);
return 0;
}