题解:P3529 [POI 2011] PRO-Programming Contest

P3529 [POI 2011] PRO-Programming Contest
对于这个题,我们首先想到的是:
将源点向选手连边,容量为 tr ,表示所给时间内能做的最多题.
选手再向会做的题目连边,容量为 1 ,表示一个题就做一遍.
题目最后向汇点连边,容量为 1 ,表示一个题最多只会被做一遍.
建边后我们跑一遍最大流求出答案.
但是我们发现这种做法并没有考虑到罚时的问题,并不能保证罚时最短,会出现一个人做很多道题导致罚时过多的情况.
所以我们可以考虑逐渐增加源点向选手连边的容量大小,保证一个选手先做一个题,再逐渐增加,这样子罚时肯定最少.若增加选手可做的题数最大流却没有增加就停止.
对于如何输出后面的答案,我们只需要把所有选手和题目的连边跑一遍,如果流量被用完,那就是这个题目被这个选手做了.

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=7e5+10;
struct node{
int u,v,w,nxt;
}g[N];
int head[N],cur[N],dis[N],a1[N],a2[N],a3[N],num[N];//a1,a2,a3记录3个答案值,num表示每个人做的题数
int n,m,s=0,t=1e4,r,ti,k,idx=1;//idx初始化为1,从2开始(使得i^1刚好能与i配对)
void add(int u,int v,int w){
g[++idx]={u,v,w,head[u]};head[u]=idx;
g[++idx]={v,u,0,head[v]};head[v]=idx;//反向建边
}
bool bfs(){//寻找增广路
memset(dis,0,sizeof(dis));
queue<int>q;q.push(s);dis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].v;
if(dis[v]==0&&g[i].w){
dis[v]=dis[u]+1;
q.push(v);
if(v==t) return 1;
}
}
}
return 0;
}
int dfs(int u,int mf){//多路增广
if(u==t) return mf;
int sum=0;
for(int &i=cur[u];i;i=g[i].nxt){//当前弧优化
int v=g[i].v;
if(dis[v]==dis[u]+1&&g[i].w){
int f=dfs(v,min(mf,g[i].w));
g[i].w-=f;
g[i^1].w+=f;
sum+=f;//累加流出流量
mf-=f;//减少流量剩余
if(mf==0) break;//如果没流量了就停止
}
}
if(sum==0) dis[u]=0;//残枝优化,删点
return sum;
}
int dinic(){//将可行流累加
int ans=0;
while(bfs()){
memcpy(cur,head,sizeof(head));
ans+=dfs(s,1e9);//初始可行流流量为无穷大
}
return ans;
}
signed main(){
cin>>n>>m>>r>>ti>>k;
for(int i=1;i<=m;i++){
add(1000+i,t,1);
}
for(int i=1;i<=k;i++){
int a,b;cin>>a>>b;
add(a,1000+b,1);
}
int last=0,now=0;
for(int i=1;i<=ti/r;i++){
for(int j=1;j<=n;j++) add(s,j,1);
now+=dinic();//将流累加
if(now==last) break;
last=now;
}
int tot=0,ans=0;
for(int i=2;i<=idx;i+=2){//寻找流量用完的边,表示这个题他做了
int u=g[i].u,v=g[i].v;
if(u!=s&&v!=t&&g[i].w==0){//排除不是选手和题目之间的连边
a1[++tot]=u;a2[tot]=v-1000;a3[tot]=num[u]++*r;;ans+=a3[tot]+r;
}
}
cout<<now<<" "<<ans<<"\n";
for(int i=1;i<=tot;i++){
cout<<a1[i]<<" "<<a2[i]<<" "<<a3[i]<<"\n";
}
return 0;
}
posted @   BSS梅者如西  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
   
点击右上角即可分享
微信分享提示