博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1927 SDOI2010 星际竞速 费用流
阅读量:5360 次
发布时间:2019-06-15

本文共 1867 字,大约阅读时间需要 6 分钟。

题意:给定一张有向图,边均由编号较大的点连向编号较小的点,每个点都有一个权值a,表示可以从任意一个点转移到i点,花费a[i]的费用。求遍历每个点一次且仅一次的最小费用,起点终点任意,保证有解。

题解:拆点,费用流决定经过的点的顺序,由于瞬移到i的费用与之前经过的点无关,所以可以直接从S向每个点i连流量为1费用为a[i]的边。

#include 
#include
#include
#include
#include
#include
#include
using namespace std;#define S 0#define T (2*N+1)#define INF 1061109567 const int MAXN=2000+6;const int MAXM=40000+6;struct Hash{ int u; Hash *Next; Hash(){} Hash(int _u,Hash *_Next):u(_u),Next(_Next){}}*Tab[MAXN],Mem[MAXM],*From[MAXN];struct Edge{ int u,v,c,w; Edge(){} Edge(int _u,int _v,int _c,int _w):u(_u),v(_v),c(_c),w(_w){}}e[MAXM];int N,M,cnt,d[MAXN];bool Flag[MAXN];deque
q; void Insert(int u,int v,int c,int w){ Tab[u]=&(Mem[cnt]=Hash(cnt,Tab[u])),e[cnt++]=Edge(u,v,c,w); Tab[v]=&(Mem[cnt]=Hash(cnt,Tab[v])),e[cnt++]=Edge(v,u,0,-w);} bool SPFA(int s,int t){ memset(d,0X3F,sizeof(d)); d[s]=0,Flag[s]=1,q.push_back(s); int x; while(!q.empty()){ x=q.front(),q.pop_front(); for(Hash *p=Tab[x];p;p=p->Next) if(e[p->u].c && d[e[p->u].v]>d[x]+e[p->u].w){ d[e[p->u].v]=d[x]+e[p->u].w,From[e[p->u].v]=p; if(Flag[e[p->u].v]) continue; Flag[e[p->u].v]=1; if(!q.empty() && d[e[p->u].v]
u].v); else q.push_back(e[p->u].v); } Flag[x]=0; } return d[t]
u].u]) x=min(x,e[p->u].c); for(Hash *p=From[t];p;p=From[e[p->u].u]) e[p->u].c-=x,e[p->u^1].c+=x,Ret+=x*e[p->u].w; return Ret;} int MCMF(int s,int t){ int Ans=0; while(SPFA(s,t)) Ans+=Calc(s,t); return Ans;} int main(){ scanf("%d %d",&N,&M); for(int i=1,a;i<=N;i++){ scanf("%d",&a); Insert(S,N+i,1,a); } for(int i=1,u,v,w;i<=M;i++){ scanf("%d %d %d",&u,&v,&w); if(u>v) swap(u,v); Insert(u,N+v,1,w); } for(int i=1;i<=N;i++) Insert(N+i,T,1,0),Insert(S,i,1,0); cout << MCMF(S,T) << endl; return 0;}
View Code

 

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6533266.html

你可能感兴趣的文章
无线网络发射选址
查看>>
unix系统编程小结(一)------文件I/O
查看>>
一些算法的了解
查看>>
Leetcode: House Robber II
查看>>
Log4j自定义Appender
查看>>
C++字符串复制函数StrCpy算法设计(一)
查看>>
PAT_B_1078 字符串压缩与解压
查看>>
洛谷 P1303 A*B Problem
查看>>
创建函数还有一种方法
查看>>
返回绝对值--Math.Abs 方法
查看>>
教你控制 RecyclerView 滑动的节奏
查看>>
冲刺周2
查看>>
静态库lib、动态库dll基础
查看>>
day22 Python shelve模块
查看>>
Promise.race
查看>>
sigleSchool 存储过程例1
查看>>
linux下mysql开启远程访问权限及防火墙开放3306端口
查看>>
开发项目中遇到的问题集锦随时更新
查看>>
C语言中的未初始化变量的值
查看>>
二叉查找树(查找最大值、最小值、给定值、删除给定值的实现)
查看>>