Travelling Businessmen Problem
Travelling Businessmen Problem
先求出图的两个部分,可能只有一个部分
然后用set模拟,得到不同部分差最小的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
int n,m;
struct cha
{
int u,v,w;
bool operator<(const cha&r)const
{
if(w!=r.w) return w<r.w;
else if(u!=r.u) return v<r.v;
return u<r.u;
}
} tmp;
struct node
{
int u,col,w;
bool operator<(const node&r)const
{
if(w!=r.w) return w>r.w;
else if(col!=r.col) return col<r.col;
return u>r.u;
}
};
set<cha>ans;
set<node>st;
vector<int>G[maxn];
int val[maxn];
int us[maxn],vis[maxn];
void dfs(int u,int w)
{
if(w==1) us[u]=1;
else if(w==-1) vis[u]=1;
for(int v:G[u])
{
if(w==-1&&!us[v])
{
dfs(v,1);
}
else if(w==1&&!vis[v])
{
dfs(v,-1);
}
}
}
void init()
{
st.clear();
ans.clear();
for(int i=1; i<=n; ++i)
{
st.insert(node{i,us[i],val[i]});
}
set<node>::iterator it,itt;
it=st.begin();
itt=it,++itt;
int u,v,w;
while(itt!=st.end())
{
if((*it).col!=(*itt).col)
{
u=(*it).u;
v=(*itt).u;
w=abs((*it).w-(*itt).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.insert(tmp);
}
it++;
itt++;
}
}
void del(int i)
{
node p{i,us[i],val[i]};
set<node>::iterator it,itt,a,b;
it=st.find(p);
int u,v,w;
if(it!=st.begin())
{
itt=it;
--itt;
a=itt;
if((*itt).col!=(*it).col)
{
u=(*it).u;
v=(*itt).u;
w=abs((*it).w-(*itt).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.erase(tmp);
}
}
itt=st.end();
--itt;
if(it!=itt)
{
itt=it;
++itt;
b=itt;
if((*itt).col!=(*it).col)
{
u=(*it).u;
v=(*itt).u;
w=abs((*it).w-(*itt).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.erase(tmp);
}
if(it!=st.begin())
{
if((*a).col!=(*b).col)
{
u=(*a).u;
v=(*b).u;
w=abs((*a).w-(*b).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.insert(tmp);
}
}
}
st.erase(it);
}
void ins(int i,int c)
{
val[i]=c;
node p{i,us[i],val[i]};
st.insert(p);
set<node>::iterator it,itt,a,b;
it=st.find(p);
int u,v,w;
if(it!=st.begin())
{
itt=it;
--itt;
a=itt;
if((*itt).col!=(*it).col)
{
u=(*it).u;
v=(*itt).u;
w=abs((*it).w-(*itt).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.insert(tmp);
}
}
itt=st.end();
--itt;
if(it!=itt)
{
itt=it;
++itt;
b=itt;
if((*itt).col!=(*it).col)
{
u=(*it).u;
v=(*itt).u;
w=abs((*it).w-(*itt).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.insert(tmp);
}
if(it!=st.begin())
{
if((*a).col!=(*b).col)
{
u=(*a).u;
v=(*b).u;
w=abs((*a).w-(*b).w);
if(u>v) swap(u,v);
tmp=cha{u,v,w};
ans.erase(tmp);
}
}
}
}
void solve()
{
int Q;
scanf("%d",&Q);
int op,u,v;
while(Q--)
{
scanf("%d%d%d",&op,&u,&v);
if(op==0)
{
del(u);
ins(u,v);
}
else
{
if(us[u]==us[v])
{
puts("0");
}
else
{
printf("%d\n",(*ans.begin()).w);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1; i<=n; ++i)
{
scanf("%d",&val[i]);
G[i].clear();
us[i]=vis[i]=0;
}
for(int i=1,u,v; i<=m; ++i)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,1);
init();
solve();
}
return 0;
}
Travelling Businessmen Problem的更多相关文章
- PAT A1150 Travelling Salesman Problem (25 分)——图的遍历
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem B. Travelling Camera Problem set贪心
Problem B. Travelling Camera Problem 题目连接: http://www.codeforces.com/gym/100253 Description Programm ...
- PAT 甲级 1150 Travelling Salesman Problem
https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384 The "travelling ...
- 构造 - HDU 5402 Travelling Salesman Problem
Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...
- 1150 Travelling Salesman Problem(25 分)
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- HDU 5402 Travelling Salesman Problem (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- HDOJ 5402 Travelling Salesman Problem 模拟
行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...
- PAT_A1150#Travelling Salesman Problem
Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
随机推荐
- Python 打开文件(File Open)
版权所有,未经许可,禁止转载 章节 Python 介绍 Python 开发环境搭建 Python 语法 Python 变量 Python 数值类型 Python 类型转换 Python 字符串(Str ...
- webpack随笔2--编译ES6/ES7
一.Babel 1.安装babel Bable-loader: babeljs.io babel最新版:npm install babel-loader@8.0.0-beta.0 @babel/cor ...
- mysql视图使用方法
1.为什么要使用视图 对于复杂的查询,往往是有多个数据表进行关联查询而得到,而这种语句往往比较复杂,也可能非常频繁的使用.比如: select 字段一,字段二.字段三, from 数据表1 join ...
- 全面掌握Nginx配置+快速搭建高可用架构 一 Nginx的访问控制
语法 示例 allow 127.0.0.1; deny all; 缺点:局限性 如果通过代理就可以绕过访问限制,限制不准确 解决 1. http_x_forwarded_for 2. 结合geo模块作 ...
- 登录之后跳转到登录之前的页面 之 Referer 的坑
简而言之:通过鼠标在页面上点击链接发送请求,请求header中会包含referer信息, 通过在浏览器地址栏书写并发送请求的,header中不会有referer信息. 为了完成登录动作成功后返回原页面 ...
- Vue.js(16)之 directive自定义指令
推荐阅读:Vue.directive基础,在Vue模块开发中使用 全局指令 Vue.directive('全局自定义指令名称', { /* 自定义指令配置对象 */ }) 私有指令 <templ ...
- iOS 多线程 GCD part3:API
https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...
- Swift 3 :基于 AVAudioPlayer 的简单音乐播放器
2017.05.22 17:46* 字数 1585 阅读 5095评论 0喜欢 8赞赏 2 https://www.jianshu.com/p/4d5c257428a1 学习ios以来差不多接近两个月 ...
- package跨模块调用
module包 logger模块 def logger(): print("logger") # logger() main模块 from module import logger ...
- Android群英传神兵利器读书笔记——第二章:版本控制神器——Git
本人一直是徐医生的真爱粉,由于参加比赛耽误了8天,导致更新得有点慢,大家见谅 2.1 Git的前世今生 Git是什么 Git安装与配置 2.2 创建Git仓库 Git init Git clone 2 ...