Pagini recente » Diferente pentru planificare/sedinta-20081107 intre reviziile 19 si 20 | Pitici2 | Mosia | Profil Arkiny | Cod sursa (job #433043)
Cod sursa(job #433043)
#include<fstream>
#include<vector>
#include<queue>
#define MAXN 301
#define MAX 10000000
using namespace std;
ifstream fin("cmcm.in");
ofstream fout("cmcm.out");
int n,m,e,S,T,drum,flux,cup;
int c[2*MAXN][2*MAXN][2],f[2*MAXN][2*MAXN],pus[MAXN*2],t[MAXN*2],d[MAXN*2];
vector < pair < int,int > > v[2*MAXN];
vector < pair < int,int > > ::iterator it;
queue < int > q;
void citire()
{ int i,x,y,cst;
fin>>n>>m>>e;
for(i=1;i<=e;i++)
{ fin>>x>>y>>cst;
c[x][n+y][0]=1;
c[x][n+y][1]=i;
v[x].push_back(make_pair(n+y,cst));
v[n+y].push_back(make_pair(x,-cst));
}
S=0;
T=n+m+1;
for(i=1;i<=n;i++)
{ c[0][i][0]=1;
v[0].push_back(make_pair(i,0));
v[i].push_back(make_pair(0,0));
}
for(i=1;i<=m;i++)
{ c[i+n][T][0]=1;
v[i+n].push_back(make_pair(T,0));
v[T].push_back(make_pair(i+n,0));
}
}
int bellford()
{ int i;
for(i=1;i<=T;i++)
{ d[i]=MAX;
t[i]=0;
pus[i]=0;
}
pus[S]=1;
q.push(S);
while(!q.empty())
{ int nod=q.front();
for(it=v[nod].begin();it!=v[nod].end();it++)
if(d[it->first]>d[nod]+it->second&&c[nod][it->first][0]>f[nod][it->first])
{ d[it->first]=d[nod]+it->second;
t[it->first]=nod;
if(pus[it->first]==0)
{ q.push(it->first);
pus[it->first]=1;
}
}
pus[nod]=0;
q.pop();
}
if(d[T]!=MAX)
{ drum=1;
i=T;
while(i!=S)
{ f[t[i]][i]++;
f[i][t[i]]--;
i=t[i];
}
return d[T];
}
return 0;
}
void cuplaj()
{ drum=1;
while(drum)
{ drum=0;
flux+=bellford();
cup++;
}
}
int main()
{ int i,j;
citire();
cuplaj();
fout<<cup-1<<" "<<flux<<"\n";
for(i=1;i<=n;i++)
for(j=n+1;j<=n+m+1;j++)
if(f[i][j]) fout<<c[i][j][1]<<" ";
fin.close();
fout.close();
return 0;
}