Pagini recente » Cod sursa (job #3167701) | Cod sursa (job #2490384) | Cod sursa (job #580351) | Cod sursa (job #2585180) | Cod sursa (job #2761576)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#include <iostream>
#define maxn 605
#define maxm 50005
using namespace std;
ifstream be("cmcm.in");
ofstream ki("cmcm.out");
pair<int,int> aux[maxm];
int cap[maxn][maxn];
int c[maxn][maxn];
vector<int>adj[maxn];
int new_d[maxn],old_d[maxn],real_d[maxn], d[maxn],l[maxn],in[maxn];
queue<int>q;
int n,m,fin,lef,righ,s;
int cost,fl;
bool in_queue[maxn];
bool dijkstra()
{
memset(d,0x3f,sizeof(d));
d[s]=0;
real_d[s]=0;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int>> >pq;
pq.push({d[s],s});
while(!pq.empty())
{
auto best=pq.top();
int z=-best.first;
int x=best.second;
pq.pop();
if(z!=d[x])continue;
for(auto p :adj[x])
{
if(cap[x][p]){
int new_d = d[x] + c[x][p] + old_d[x] - old_d[p];
if (new_d < d[p])
{
d[p] = new_d;
real_d[p] = real_d[x] + c[x][p];
l[p] = x;
//cout<<p<<endl;
pq.push({-d[p], p});
}
}
}
}
memcpy(old_d,real_d,sizeof(d));
/*for(int i=1;i<=n;i++)
old_d[i]=real_d[i];*/
if(d[fin]==0x3f3f3f3f)
return false;
int minim=0x3f3f3f3f;
for(int i=fin;i!=s;i=l[i]){
minim=min(minim,cap[l[i]][i]);
}
cost+=minim*real_d[fin];
fl+=minim;
for(int i=fin;i!=s;i=l[i])
{
cap[l[i]][i]-=minim;
cap[i][l[i]]+=minim;
}
return true;
}
bool bellmanford()
{
//memset(old_d,0x3f,sizeof(old_d));
for(int i=1;i<=n;i++)
old_d[i]=0x3f;
old_d[s]=0;
for(q.push(s),in[s]=1;!q.empty();q.pop())
{
int i=q.front();
in_queue[i]=false;
for(auto p:adj[i])
{
if(cap[i][p])
{
if(old_d[i]+c[i][p]>=old_d[p])
continue;
old_d[p]=old_d[i]+c[i][p];
if(in_queue[p])
continue;
in_queue[p]=true;
q.push(p);
}
}
}
if(old_d[fin]==0x3f3f3f3f)
return false;
return true;
}
int main()
{
be>>lef>>righ>>m;
n=lef+righ+2;
s=n-1,fin=n;
for(int i=1;i<=m;i++)
{
int x,y,z;
be>>x>>y>>z;
y+=lef;
cap[x][y]=1;
c[x][y]=z;
c[y][x]=-z;
adj[x].push_back(y);
adj[y].push_back(x);
aux[i]={x,y};
}
for(int i=1;i<=lef;i++)
{
cap[s][i]=1;
adj[s].push_back(i);
adj[i].push_back(s);
}
for(int i=1;i<=righ;i++)
{
cap[lef+i][fin]=1;
adj[fin].push_back(lef+i);
adj[i+lef].push_back(fin);
}
bellmanford();
while(dijkstra());
ki<<fl<<" "<<cost<<"\n";
for(int i=1;i<=m;i++)
{
if(cap[aux[i].first][aux[i].second]==0)
ki<<i<<" ";
}
return 0;
}