对于每个平面图,都有唯一一个对偶图与之对应。若G‘是平面图G的对偶图,则满足:

G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面。

直观地讲,红色标出来的图就是蓝色标出的图的对偶图。

求出一个平面图的对偶图(而且不是特殊的结构),可以贪心地找出所有最小的面。但如何描述最小?我们要固定一条边,按它顺时针或逆时针的方向找到第一条边,直到出现第一个访问过的边,就找到了一个面。

具体地将:从每个边出发,按有方向的角排序,找到角度最大或最小的边,再进行下去。反正自己写写代码就知道了。


例题

给出一个平面图,每个点有a和b两种属性,每个面(包括无限大的面)的价值为在这个面上的点的a总和或b总和,若相邻的面所选的属性不同,代价为所有相邻点边的点权和。最大化总价值。N≤4000。


思路

考场上从没写过对偶图,结果自己搞出来了.......反而最小割没写出来。

转完对偶图后,从S向每个对偶图上的点连一条比边权为该面的a价值总和的边,再从这个点向T连一条边权为该面的b价值总和的边。对于原图相邻的面,连一条权值为公共边价值和的边(这个要双向)。不难发现其最小割为最小的代价。

如:重复的边合并即可。

一个不需要代码的代码:

 #include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const double pi=3.1415926535898;
const ll maxn=2E5+;
const ll inf=INT_MAX;
ll min(ll x,ll y){return x<y?x:y;}
struct pt
{
double x,y;
int pos;
pt(double a=,double b=,int p=){x=a,y=b;pos=p;}
void operator=(pt A){x=A.x,y=A.y,pos=A.pos;}
pt operator+(pt A){return pt(x+A.x,y+A.y,pos);}
pt operator-(pt A){return pt(x-A.x,y-A.y,pos);}
void out(){cout<<x<<" "<<y<<" ";}
}p[maxn];
ll n,m,v[maxn][],x,y,z,cur,val[maxn][],ans,dfn[maxn],ti,S,T;
bool vis[maxn*];
map<int,int>next;
map<pair<int,int>,int>cost;
set<pair<int,int> >eS;
pt rotate(pt A,double ra){return pt(A.x*cos(ra)-A.y*sin(ra),A.x*sin(ra)+A.y*cos(ra),A.pos);}
pt wait[maxn];
bool cmp(pt A,pt B)
{
double r1=atan2(A.y,A.x);
double r2=atan2(B.y,B.x);
if(r1<)r1+=*pi;
if(r2<)r2+=*pi;
return r1<r2;
}
struct edge{ll to,next,from,w,bel;};
struct graph
{
int head[maxn*],size;
graph(){size=;}
edge E[maxn*];
void add(int u,int v,ll w)
{
E[++size].to=v;
E[size].next=head[u];
E[size].w=w;
E[size].from=u;
head[u]=size;
}
void sortAngle(pt A,pt B,int r,int num)//suppose that A is the centre
{
B=B-A;
double ra=-atan2(B.y,B.x);
B=rotate(B,ra);
for(int i=;i<=r;++i)wait[i]=rotate(wait[i]-A,ra);
sort(wait+,wait+r+,cmp);
next[num]=wait[].pos;
for(int i=;i<r;++i)
next[wait[i].pos^]=wait[i+].pos;
next[wait[r].pos^]=num^;
}
void sortAll()
{
for(int i=;i<=size;++i)
{
if(next[i]==)
{
int L=;
for(int j=head[E[i].to];j;j=E[j].next)
{
if(E[j].to==E[i].from)continue;
wait[++L]=p[E[j].to];
wait[L].pos=j;
}
sortAngle(p[E[i].to],p[E[i].from],L,i);
}
}
}
void dfs(int i,int pos)
{
ans+=v[E[i].to][];
ans+=v[E[i].to][];
vis[i]=;
E[i].bel=pos;
val[pos][]+=v[E[i].to][];
val[pos][]+=v[E[i].to][];
i=next[i];
if(vis[i])return;
dfs(i,pos);
}
void getVal()
{
sortAll();
for(int i=;i<=size;++i)
if(!vis[i])
{
++cur;
dfs(i,cur);
}
}
bool bfs()
{
for(int i=;i<=T;++i)dfn[i]=-;
dfn[S]=;
queue<int>Q;
Q.push(S);
while(Q.size())
{
int u=Q.front();
Q.pop();
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(dfn[v]!=-||E[i].w==)continue;
dfn[v]=dfn[u]+;
Q.push(v);
}
}
return dfn[T]!=-;
}
ll dinic(int u,ll up)
{
if(u==T)return up;
ll sum=;
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(dfn[v]!=dfn[u]+||E[i].w==)continue;
ll g=dinic(v,min(E[i].w,up-sum));
E[i].w-=g;
E[i^].w+=g;
sum+=g;
if(g==)dfn[v]=-;
if(sum==up)break;
}
return sum;
}
}G,flow;
int main()
{
freopen("everfeel.in","r",stdin);
freopen("everfeel.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>n>>m;
for(int i=;i<=n;++i)
cin>>p[i].x>>p[i].y>>v[i][]>>v[i][];
for(int i=;i<=m;++i)
{
cin>>x>>y>>z;
G.add(x,y,z);
G.add(y,x,z);
}
G.getVal();
S=;
T=cur+;
for(int i=;i<=G.size;i+=)
{
pair<int,int>P=make_pair(G.E[i].bel,G.E[i^].bel);
cost[P]+=G.E[i].w;
eS.insert(P);
}
for(set<pair<int,int> >::iterator pos=eS.begin();pos!=eS.end();++pos)
{
flow.add(pos->first,pos->second,cost[*pos]);
flow.add(pos->second,pos->first,cost[*pos]);
}
for(int i=;i<=cur;++i)
{
flow.add(S,i,val[i][]);
flow.add(i,S,);
flow.add(i,T,val[i][]);
flow.add(T,i,);
}
ll sum=;
while(flow.bfs())sum+=flow.dinic(S,inf);
cout<<ans-sum<<endl;
return ;
}
要数据请联系。

平面图转对偶图&19_03_21校内训练 [Everfeel]的更多相关文章

  1. [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)

    题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...

  2. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  3. 平面图转对偶图(Bzoj1001:狼抓兔子)

    如果只会用最小割做这道题那就太菜辣 引入 来自某学长 平面图:在平面上边不相交的图(边可以绕着画) 那么平面图的边与边就围成了许多个区域(这与你画图的方式有关) 定义对偶图:把相邻的两个区域连上边,形 ...

  4. bzoj3051[WC2013]平面图(树上倍增+平面图转对偶图+扫描线)

    简要题意:二维平面上n个点,点之间有一些连线,连线不在点之外的地方相交,将平面分为若干个区域.给出一些询问点对,问从这个点所在的区域走到另一个点所在的区域的最小代价. 题解:这道题首先可以把平面图转对 ...

  5. LOJ#2052. 「HNOI2016」矿区(平面图转对偶图)

    题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\ ...

  6. 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)

    [BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...

  7. 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)

    [BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...

  8. 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2504  Solved: 1195 Description YT市 ...

  9. 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)

    题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...

随机推荐

  1. mysql 安装成功以及第一次安装成功初始化密码操作

    一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 环境变量   新建 变量 ...

  2. U8工具栏特别小是怎么回事

    用友的工具栏特别窄了,填制凭证里的保存.增加凭证等按钮因为工具栏特别窄都看不清了 解决方法:正常机器下的system32下面的mscomctl.ocx文件替换到有问题的机器下,您的系统应该是XP的,这 ...

  3. TEA加密/解密算法

    在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来.TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快.可以根据项 ...

  4. 2d游戏和 3d游戏的区别

    2D游戏和3D游戏的主要区别 一.总结 一句话总结:2D中的单位就是贴图,3D中的单位还有高 1. 3D 和 2D 游戏的区别主要体现在呈现画面和文件体积上: 2. 借助 3D 引擎可以提升 2D 游 ...

  5. GrindEQ Math Utilities 2015破解版 图文安装和序列号补丁激活教程

    GrindEQ Math Utilities 2015破解版 图文安装和序列号补丁激活教程 https://www.sdbeta.com/mf/2018/1002/226048.html 软件下载: ...

  6. LeetCode--235--二叉树的最近公共祖先

    问题描述: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的 ...

  7. Confluence 6 空间标识

    每一个 Confluence 空间都有一个 空间标识(space key),这个空间标识是简短并且是唯一的,这个标识被用来构建到空间的 URL 中. 当你创建一个站点空间,Confluence 将会为 ...

  8. Windows定时开机并开启工作软件

    开启休眠功能 在搜索窗口中输入“cmd.exe”,在结果中看见了“cmd.exe”,右击选择“以管理员权限运行程序”打开“cmd.exe”命令窗口,输入命令“powercfg -h on”即可开启计算 ...

  9. P3721 [AH2017/HNOI2017]单旋

    题目:https://www.luogu.org/problemnew/show/P3721 手玩一下即可AC此题. 结论:插入x后,x要么会成为x的前驱的右儿子,要么成为x的后继的左儿子,这取决于它 ...

  10. Django模型类之models字段类型和参数以及元数据meta

    models之字段类型和参数 示例: # class Test(models.Model): # courses_test # """测试学习用""& ...