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的更多相关文章

  1. PAT A1150 Travelling Salesman Problem (25 分)——图的遍历

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  2. 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 ...

  3. PAT 甲级 1150 Travelling Salesman Problem

    https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384 The "travelling ...

  4. 构造 - HDU 5402 Travelling Salesman Problem

    Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...

  5. 1150 Travelling Salesman Problem(25 分)

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  6. HDU 5402 Travelling Salesman Problem (构造)(好题)

    大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...

  7. HDOJ 5402 Travelling Salesman Problem 模拟

    行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...

  8. PAT_A1150#Travelling Salesman Problem

    Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...

  9. HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)

    Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

随机推荐

  1. Atom :奥特曼的使用

    最近在使用atom的编译器,很不爽,什么快捷键,还有识别vue的页面,还有注释这种快捷下载下来的都没有 必须到setting里面的install里下载,我能大声的说我很不爽吗............ ...

  2. C# Stream篇(二) -- TextReader 和StreamReader

    TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简 ...

  3. linux文件编辑VI命令详解

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  4. Maven - Eclipse例子

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  5. c# 数据库操作,多数据库操作、数据库操作异常报错等问题

    1.引入相关的命名空间 在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间: System.Data;描述与数据源连接的当前状态. // // 摘要: // 连 ...

  6. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  7. python类(4)——自己造第一个轮子

    先做简单版本,再一步步增加功能 1.简单目的:要实现这样一个功能,能够连接服务器,登录账号,查询账号委托信息,如果有委托信息,撤销委托. 属性(不同账户之间差别):账户,密码 方法(不同账户之间都要用 ...

  8. 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询

    AddFragment.java: package com.example.familybooks; import android.content.ContentValues; import andr ...

  9. MySQL 插入 中文数据乱码解决

    问题描述: 1.在命令行中进行插入,没有问题.但是显示存在部分乱码 2.在JDBC中插入成功.中文是直接以“??”形式显示. 通过Navicat客户端查看 与在网页中看到的一一致,说明读取没有问题,问 ...

  10. 吴裕雄--天生自然 JAVASCRIPT开发学习: JSON

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...