Pagini recente » Cod sursa (job #711396) | Cod sursa (job #2786964) | Cod sursa (job #724837) | Cod sursa (job #3003359) | Cod sursa (job #582395)
Cod sursa(job #582395)
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#define INF 0x3f3f3f3f
#define Nmx 620
using namespace std;
int n,m,s,d,T,viz[Nmx],prec[Nmx],C[Nmx][Nmx],dist[Nmx],F[Nmx][Nmx];
struct nod{int inf,cost;nod *urm;};
nod *G[Nmx];
queue <int> Q;
ifstream fin("cmcm.in");
void add(int x,int y,int c)
{
nod *aux=new nod;
aux->inf = y;
aux->cost = c;
aux->urm = G[x];
G[x] = aux;
}
void read()
{
int x,y,c;
fin>>n>>m>>T;
s=1;
d=1+n+m+1;
for(;T;--T)
{
fin>>x>>y>>c;
x++;y=y+n+1;
C[1][x]=C[y][d]=C[x][y]=1;
add(x,y,c);add(y,x,-c);
add(1,x,0);add(x,1,0);
add(y,d,0);add(d,y,0);
}
}
int bellmand()
{
for(int i=1;i<=d;++i)
{
dist[i]=INF;
prec[i]=0;
viz[i]=0;
}
dist[1]=0;viz[1]=1;
Q.push(1);
while(!Q.empty())
{
int x=Q.front();
Q.pop();
viz[x]=0;
for(nod *p=G[x];p;p=p->urm)
if(C[x][p->inf]-F[x][p->inf]>0&&dist[p->inf]>dist[x]+p->cost)
{
dist[p->inf]=dist[x]+p->cost;
prec[p->inf]=x;
if(!viz[p->inf])
{
viz[p->inf]=1;
Q.push(p->inf);
}
}
}
if(dist[d]<INF)
return 1;
return 0;
}
void solve()
{
int sol=0,cuplaj=0;
while(bellmand())
{
int Vmin=INF;
for(int j=d;prec[j];j=prec[j])
Vmin=min(Vmin,C[prec[j]][j]-F[prec[j]][j]);
if(Vmin)
{
for(int j=d;prec[j];j=prec[j])
{
F[prec[j]][j]+=Vmin;
F[j][prec[j]]-=Vmin;
}
if(dist[d]*Vmin)
{
cuplaj+=Vmin;
sol+=dist[d];
}
}
}
printf("%d %d\n",cuplaj,sol);
fin.close();
ifstream fin("cmcm.in");
fin>>n>>m>>T;
int x,y,c;
for(int i=1;i<=T;++i)
{
fin>>x>>y>>c;
if(F[x+1][y+1+n])
printf("%d ",i);
}
printf("\n");
}
int main()
{
freopen("cmcm.out","w",stdout);
read();
solve();
return 0;
}