P2469 [SDOI2010]星际竞速(费用流)
最小路径覆盖问题
每个星球必须恰好去一次,而每次高速航行都是从一个星球到另一个星球。
那么高速航行的起点可以保证被去过
高速航行和空间跳跃可以是互相独立的
将每个点i拆成i1,i2,套路地连边
link(S,i1,1,0)
link(S,i2,1,vali)
link(i2,T,1,0)
对于每条边(u,v,w):
link(u1,v2,w)
蓝后跑一遍费用流,费用流会覆盖所有路径(i2,T)
满流的最小代价即为答案
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define N 2005 #define M 100005 int n,m,S,T,d[N],a[N],p[N],tC; queue <int> h; bool inh[N]; int cnt=1,hd[N],nxt[M],ed[N],poi[M],val[M],cst[M]; inline void adde(int x,int y,int v1,int v2){ nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt, ed[x]=cnt, poi[cnt]=y, val[cnt]=v1,cst[cnt]=v2; } inline void link(int x,int y,int v1,int v2){adde(x,y,v1,v2),adde(y,x,0,-v2);} bool bfs(){ memset(d,127,sizeof(d)); int inf=d[0]; h.push(S); d[S]=0; a[S]=inf; inh[S]=1; while(!h.empty()){ int x=h.front(); h.pop(); inh[x]=0; for(int i=hd[x];i;i=nxt[i]){ int to=poi[i]; if(val[i]>0&&d[to]>d[x]+cst[i]){ d[to]=d[x]+cst[i]; p[to]=i; a[to]=min(a[x],val[i]); if(!inh[to]) inh[to]=1,h.push(to); } } }if(d[T]==inf) return 0; tC+=a[T]*d[T]; for(int i=T;i!=S;i=poi[p[i]^1]) val[p[i]]-=a[T],val[p[i]^1]+=a[T]; return 1; } int main(){ scanf("%d%d",&n,&m); int u,v,w; S=n*2+1; T=S+1; for(int i=1;i<=n;++i){ link(S,i,1,0); link(i+n,T,1,0); scanf("%d",&w); link(S,i+n,1,w); } for(int i=1;i<=m;++i){ scanf("%d%d%d",&u,&v,&w); if(u>v) swap(u,v); link(u,v+n,1,w); }while(bfs()); printf("%d",tC); return 0; }
标签:
费用流
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端