Pagini recente » Cod sursa (job #2496600) | Cod sursa (job #539701) | Cod sursa (job #2270960) | Cod sursa (job #914552) | Cod sursa (job #902648)
Cod sursa(job #902648)
#include <fstream>
#include <vector>
#include <queue>
#define nmax 610
#define oo (1<<30)
#define Vecin G[Nod][i]
using namespace std;
queue <int> Q;
vector <int> G[nmax],Answer;
int N,M,Flow[nmax][nmax],Edge[nmax][nmax];
int Source,Destination,Cost[nmax][nmax];
int MaxFlow,T[nmax],Dist[nmax];
bool inQ[nmax];
bool BellmanFord() {
int i,Nod;
for(i=Source;i<=Destination;i++)
Dist[i]=oo;
Dist[Source]=0;
Q.push(Source);
while(!Q.empty()) {
Nod=Q.front();
inQ[Nod]=false;
Q.pop();
for(i=0;i<G[Nod].size();i++)
if(Flow[Nod][Vecin] && Dist[Vecin]>Dist[Nod]+Cost[Nod][Vecin]) {
Dist[Vecin]=Dist[Nod]+Cost[Nod][Vecin];
T[Vecin]=Nod;
if(!inQ[Vecin]) {
Q.push(Vecin);
inQ[Vecin]=true;
}
}
}
return (Dist[Destination]!=oo);
}
void solve() {
int i,j,Nod;
Source=0;
Destination=N+M+1;
for(i=1;i<=N;i++) {
G[Source].push_back(i);
Flow[Source][i]=1;
}
for(i=N+1;i<Destination;i++) {
G[i].push_back(Destination);
Flow[i][Destination]=1;
}
while(BellmanFord()) {
for(Nod=Destination;Nod!=Source;Nod=T[Nod]) {
Flow[Nod][T[Nod]]++;
Flow[T[Nod]][Nod]--;
}
MaxFlow+=Dist[Destination];
}
for(i=1;i<=N;i++)
for(j=N+1;j<Destination;j++)
if(!Flow[i][j] && Edge[i][j]) {
Answer.push_back(Edge[i][j]);
break;
}
}
void read() {
int x,y,c,i,E;
ifstream in("cmcm.in");
in>>N>>M>>E;
for(i=1;i<=E;i++) {
in>>x>>y>>c;
y+=N;
G[x].push_back(y);
G[y].push_back(x);
Cost[x][y]=c;
Cost[y][x]=-c;
Flow[x][y]=1;
Edge[x][y]=i;
}
in.close();
}
void write() {
ofstream out("cmcm.out");
out<<Answer.size()<<' '<<MaxFlow<<'\n';
for(int i=0;i<Answer.size();i++)
out<<Answer[i]<<' ';
out<<'\n';
out.close();
}
int main() {
read();
solve();
write();
return 0;
}