题面

传送门

思路

其实就是很明显的平面图模型。

不咕咕咕的平面图学习笔记

用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁

建立网络流图:

源点连接至每一个对偶图点,权值为这个区域的光明能量

每一个对偶图点连接至汇点,权值为这个区域的黑暗能量

对于每一条原图中的边,在它两侧的对偶图点之间连一条双向边,权值为这个边的代价

用所有点的光明能量和黑暗能量之和,减去最小割,得到的就是答案

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#define next DEEP_DARK_FANTASY
#define mp make_pair
#define ll long long
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') flag=-1;
ch=getchar();
}
while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
int n,m,T,x[100010],y[100010],light[100010],dark[100010],cnt;
vector<pair<int,int> >e[100010];
vector<pair<long double,int> >ee;
map<int,int>suf[100010],col[100010];
int suml[100010],sumd[100010];
namespace g{//当前弧dinic
int first[100010],cnte=-1;
struct edge{
int to,next,w;
}a[1000010];
inline void init(){memset(first,-1,sizeof(first));}
inline void add(int u,int v,int w1,int w2){
a[++cnte]=(edge){v,first[u],w1};first[u]=cnte;
a[++cnte]=(edge){u,first[v],w2};first[v]=cnte;
}
int dep[100010],cur[100010];queue<int>q;
inline bool bfs(int s,int t){
int i,u,v;
for(i=s;i<=t;i++) dep[i]=-1,cur[i]=first[i];
dep[s]=0;q.push(s);
while(!q.empty()){
u=q.front();q.pop();
for(i=first[u];~i;i=a[i].next){
v=a[i].to;if(~dep[v]||!a[i].w) continue;
dep[v]=dep[u]+1;q.push(v);
}
}
return ~dep[t];
}
inline int dfs(int u,int t,int lim){
if(u==t||!lim) return lim;
int i,v,f,flow=0;
for(i=cur[u];~i;i=a[i].next){
v=a[i].to;cur[u]=i;
if(dep[v]==dep[u]+1&&(f=dfs(v,t,min(a[i].w,lim)))){
a[i].w-=f;a[i^1].w+=f;
flow+=f;lim-=f;
if(!lim) return flow;
}
}
return flow;
}
inline int dinic(int s,int t){
int re=0;
while(bfs(s,t)) re+=dfs(s,t,1e9);
return re;
}
}
int main(){
T=read();n=read();m=read();int i,j,t1,t2,t3,tot,pos,from,next;
for(i=1;i<=n;i++){
x[i]=read();y[i]=read();
light[i]=read();dark[i]=read();
}
for(i=1;i<=m;i++){
t1=read();t2=read();t3=read();
e[t1].push_back(mp(t2,t3));
e[t2].push_back(mp(t1,t3));
}
for(i=1;i<=n;i++){
tot=e[i].size();ee.clear();
for(j=0;j<tot;j++){
ee.push_back(mp(atan2(y[e[i][j].first]-y[i],x[e[i][j].first]-x[i]),e[i][j].first));
}
sort(ee.begin(),ee.end());
for(j=0;j<tot-1;j++){//最左转线预处理:标记每一个点的后继
suf[i][ee[j].second]=ee[j+1].second;
}
if(tot) suf[i][ee[tot-1].second]=ee[0].second;
}
for(i=1;i<=n;i++){
for(j=0;j<e[i].size();j++){
pos=e[i][j].first;from=i;
if(col[i][pos]) continue;
cnt++;
col[i][pos]=cnt;
suml[cnt]+=light[pos];
sumd[cnt]+=dark[pos];
while(1){//求出一个区域
next=suf[pos][from];
if(col[pos][next]) break;
from=pos;pos=next;
col[from][pos]=cnt;
suml[cnt]+=light[pos];
sumd[cnt]+=dark[pos];
}
}
}
g::init();int ans=0;
for(i=1;i<=cnt;i++){
g::add(0,i,suml[i],0);
g::add(i,n<<1,sumd[i],0);
ans+=suml[i];ans+=sumd[i];
}
for(i=1;i<=n;i++){
for(j=0;j<e[i].size();j++){
t1=col[i][e[i][j].first];
t2=col[e[i][j].first][i];
if(i<e[i][j].first) g::add(t1,t2,e[i][j].second,e[i][j].second);
}
}
cout<<ans-g::dinic(0,n<<1)<<'\n';
}

最新文章

  1. bzoj 3295 动态逆序对 CDQ分支
  2. scikit-learn的梯度提升算法(Gradient Boosting)使用
  3. flexslider
  4. IOC及Bean容器
  5. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON ObjToInteger1-4
  6. BootStrap2学习日记10---单选框和复选框
  7. jQuery网页元素拖拽插件
  8. 跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量
  9. Codeforces 439 A. Devu, the Singer and Churu, the Joker
  10. angular post发送请求和GET发送请求,服务器端接收不到信息的问题
  11. Leetcode - Reverse Words
  12. Java与C#间json日期格式互转完美解决方案
  13. 当今Web应用的主要技术
  14. iOS 面试大全从简单到复杂(简单篇)
  15. selenium webdriver 的环境搭建时注意事项
  16. C#解压文件,Excel操作
  17. Django 之缓存
  18. golang array, slice, string笔记
  19. Netty源码分析第7章(编码器和写数据)----&gt;第2节: MessageToByteEncoder
  20. 树莓派指定静态IP

热门文章

  1. SpringBoot-04:SpringBoot在idea中的俩种创建方式
  2. RTL8188EUS之MAC地址烧写(使用利尔达模组)
  3. C# 调用webserver 出现:未能从程序集“jgd3jufm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型
  4. windows安装logstash-input-jdbc并使用其导入MMSQL数据
  5. Spring Cloud(七):配置中心(Git 版与动态刷新)【Finchley 版】
  6. Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
  7. PAT1024 强行用链表写了一发。
  8. lintcode-148-颜色分类
  9. Swift-可选值(Optional)讲解
  10. &lt;Effective C++&gt;读书摘要--Implementations&lt;二&gt;