题解:P3529 [POI 2011] PRO-Programming Contest
P3529 [POI 2011] PRO-Programming Contest
对于这个题,我们首先想到的是:
将源点向选手连边,容量为
选手再向会做的题目连边,容量为
题目最后向汇点连边,容量为
建边后我们跑一遍最大流求出答案.
但是我们发现这种做法并没有考虑到罚时的问题,并不能保证罚时最短,会出现一个人做很多道题导致罚时过多的情况.
所以我们可以考虑逐渐增加源点向选手连边的容量大小,保证一个选手先做一个题,再逐渐增加,这样子罚时肯定最少.若增加选手可做的题数最大流却没有增加就停止.
对于如何输出后面的答案,我们只需要把所有选手和题目的连边跑一遍,如果流量被用完,那就是这个题目被这个选手做了.
#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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】