博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4001 [BJOI2006]狼抓兔子
阅读量:4659 次
发布时间:2019-06-09

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

显然是网络流最小割

朴素的dinic会被卡

但是如果加上玄学优化就可以过了

主要是讲另一个方法

可以发现每条路径是不会交错的

对于样例的图,我们如果从右上随便走出发一条线到左下

把线经过的边全部割掉,就是一种可行的方案

所以可以把每个平面看成点,点之间的边就是平面之间的公共边

只要我们从右上的一个虚节点出发,走到左下的一个虚节点

它的长度就是把路径经过的边割掉的代价

所以就可以跑最短路找最小代价了

重要的是怎么把图转化

 

首先把每个平面标号,然后慢慢找规律....

具体还是看代码吧

 

#include
#include
#include
#include
#include
#include
using namespace std;inline int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return x;}const int N=2e6+7;int fir[N],from[N<<2],to[N<<2],val[N<<2],cnt;//存转化后的图inline void add(int a,int b,int c){ from[++cnt]=fir[a]; fir[a]=cnt; to[cnt]=b; val[cnt]=c;}//连边int n,m;int dis[N];struct node{ int u,v; bool operator < (const node &b) const{ return u>b.u; }};priority_queue
q;inline void Dijk()//最短路{ memset(dis,0x7f,sizeof(dis)); dis[0]=0; q.push((node){ 0,0}); while(!q.empty()) { int u=q.top().u,v=q.top().v; q.pop(); if(u!=dis[v]) continue; for(int i=fir[v];i;i=from[i]) { int x=to[i]; if(dis[v]+val[i]
>n>>m; //下面这些是可以慢慢推的... for(int i=1;i<=n;i++) for(int j=1;j

 

转载于:https://www.cnblogs.com/LLTYYC/p/9682655.html

你可能感兴趣的文章
JAVA多线程-内存模型、三大特性、线程池
查看>>
RxJS速成 (下)
查看>>
无锁栈与无锁队列
查看>>
微信开发第8章 通过accesstoken将长连接转换为短链接
查看>>
[刷题]Codeforces 785D - Anton and School - 2
查看>>
四川红油的制法
查看>>
Java重写《C经典100题》 --21
查看>>
【Android基础】Fragment 详解之Fragment生命周期
查看>>
链表(裸题)
查看>>
11运算符重载
查看>>
磁盘系统的管理
查看>>
C/S
查看>>
Http Get/Post请求的区别
查看>>
STM32一键下载电路设计原理
查看>>
C语言中函数返回字符串的四种方法
查看>>
10月区块链领域投融资事件盘点
查看>>
Mybatis缓存策略
查看>>
卷积的意义【转】
查看>>
android图形系统详解五:Android绘制模式
查看>>
[剑指offer] 23. 二叉搜索树的后序遍历序列
查看>>