[bzoj1927] [Sdoi2010]星际竞速
2016-06-28 08:43
393 查看
费用流。
因为有能力爆发这种鬼东西。。每次能力爆发就相当于重新开始一条路径...除此以外就和一般的题一样了。。
拆点,每个点从出点往能到达的入点连流量正无穷,费用为航行时间的边。
每个点从入点往出点连一条流量为1,费用为0的边限制。
S往入点,出点往T连流量为1,费用为0的边。
S往出点连流量为1,费用为能力爆发所需时间的边。
View Code
因为有能力爆发这种鬼东西。。每次能力爆发就相当于重新开始一条路径...除此以外就和一般的题一样了。。
拆点,每个点从出点往能到达的入点连流量正无穷,费用为航行时间的边。
每个点从入点往出点连一条流量为1,费用为0的边限制。
S往入点,出点往T连流量为1,费用为0的边。
S往出点连流量为1,费用为能力爆发所需时间的边。
#include<cstdio> #include<iostream> #include<cstring> #define ll long long using namespace std; const int maxn=1623,inf=1002333333; struct zs{int too,pre,dis,flow;}e[42333];int tot,last[maxn]; int dis[maxn],dl[200233]; bool u[maxn],ins[maxn]; int i,j,k,n,m,s,t,ans; int ra;char rx; inline int read(){ rx=getchar(),ra=0; while(rx<'0'||rx>'9')rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra; } inline bool spfa(){ memset(dis,60,(t+1)<<2);//printf(" %d\n",dis[0]);return 0; int l=0,r=1,i,now;dl[1]=s,dis[s]=0; while(l<r) for(i=last[now=dl[++l]],u[now]=0;i;i=e[i].pre)if(e[i].flow&&dis[e[i].too]>dis[now]+e[i].dis){ dis[e[i].too]=dis[now]+e[i].dis; if(!u[e[i].too])u[e[i].too]=1,dl[++r]=e[i].too; } return dis[t]<inf; } inline int min(int a,int b){return a<b?a:b;} int dfs(int x,int mx){ if(x==t)return mx; int i,used=0,w;ins[x]=1; for(i=last[x];i;i=e[i].pre)if(e[i].flow&&dis[e[i].too]==dis[x]+e[i].dis&&!ins[e[i].too]){ w=dfs(e[i].too,min(mx-used,e[i].flow));if(w){ e[i].flow-=w,e[i^1].flow+=w,used+=w,ans+=w*e[i].dis; if(used==mx){ins[x]=0;return mx;} } } ins[x]=0,dis[x]=inf;return used; } inline void insert(int a,int b,int c,int d){ e[++tot].too=b,e[tot].flow=c,e[tot].dis= d,e[tot].pre=last[a],last[a]=tot; e[++tot].too=a,e[tot].flow=0,e[tot].dis=-d,e[tot].pre=last[b],last[b]=tot; } int main(){ n=read(),m=read(); s=0,t=n+n+1,tot=1; for(i=1;i<=n;i++)insert(s,i+n,1,0),insert(s,i,1,read()),insert(i,t,1,0); for(i=1;i<=m;i++){ j=read(),k=read(); if(j>k)swap(j,k); insert(j+n,k,1,read()); } while(spfa())dfs(s,1<<23); printf("%d\n",ans); }
View Code
相关文章推荐
- Java实现二维码QRCode的编码和解码
- OGNL表达式
- 视频播放
- 投资项目管理考试
- session入mysql
- 投资项目管理考试
- leetcode再出发
- 打开安卓项目下的activity
- 如何学习java,自学还是培训?
- 浅谈android中异步加载之"取消异步加载"
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。 给定一个stri
- 大流量的网站如何解决访问量的问题
- SQLite更新数据列,给数据加一个前(后)缀
- OGNL中的#、%和$符号的用法
- js call() apply()
- 我与0xc000007b奋斗的日子
- Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
- xml解析-dom范例
- 数据结构与算法学习笔记
- maven