DAY 7 上午
一些图论的题目

求出最短路,枚举每条边再跑一遍即可(科技为了我
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int n,m; int head[],cnt=;
struct edge
{
int dis,to,nxt;
}edg[]; inline void add(int u,int v,int w)
{
edg[++cnt].to=v;
edg[cnt].dis=w;
edg[cnt].nxt=head[u];
head[u]=cnt;
edg[++cnt].to=u;
edg[cnt].dis=w;
edg[cnt].nxt=head[v];
head[v]=cnt;
} ll diss[];
bool vis[];
int pre[];
ll qwq;
ll ans; inline void dij()
{
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
q.push(make_pair(,));
for(int i=;i<=n;i++) diss[i]=;
diss[]=;
while(!q.empty())
{
int now=q.top().second;
q.pop();
if(vis[now]) continue;
vis[now]=;
for(int i=head[now];i;i=edg[i].nxt)
{
int v=edg[i].to;
if(diss[now]+edg[i].dis<diss[v])
{
diss[v]=diss[now]+edg[i].dis;
q.push(make_pair(diss[v],v));
pre[v]=i;
}
}
}
qwq=diss[n];
} inline void dijnew()
{
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
q.push(make_pair(,));
for(int i=;i<=n;i++) diss[i]=,vis[i]=;
diss[]=;
while(!q.empty())
{
int now=q.top().second;
q.pop();
if(vis[now]) continue;
vis[now]=;
for(int i=head[now];i;i=edg[i].nxt)
{
int v=edg[i].to;
if(diss[now]+edg[i].dis<diss[v])
{
diss[v]=diss[now]+edg[i].dis;
q.push(make_pair(diss[v],v));
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=,u,v,w;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dij();
for(int i=;i<=n;i++)
{
int t=pre[i];
edg[t].dis<<=;edg[t^].dis<<=;
dijnew();
ans=max(ans,diss[n]);
edg[t].dis>>=;edg[t^].dis>>=;
}
cout<<ans-qwq;
}

建一个分层图
原图在第一层
第一层向第二层连有向边
对于u-->v,从第一层的u点向第二层的v点连一条长度为0的边
优于更新有可能用不到k次
从上一层的点u到下一层的点u连一条长度为0的边,表示不用这次更新
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int n,m,k; int head[],cnt;
struct edge
{
int dis,to,nxt;
}edg[]; inline void add(int u,int v,int w)
{
edg[++cnt].to=v;
edg[cnt].dis=w;
edg[cnt].nxt=head[u];
head[u]=cnt; } ll diss[];
bool vis[];
ll ans; inline void dij()
{
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
q.push(make_pair(,));
for(int i=;i<=n*(k+);i++) diss[i]=;
diss[]=;
while(!q.empty())
{
int now=q.top().second;
q.pop();
if(vis[now]) continue;
vis[now]=;
for(int i=head[now];i;i=edg[i].nxt)
{
int v=edg[i].to;
if(diss[now]+edg[i].dis<diss[v])
{
diss[v]=diss[now]+edg[i].dis;
q.push(make_pair(diss[v],v));
}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=,u,v,w;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
for(int j=;j<=k;j++)
{
add(j*n+u,j*n+v,w);
add(j*n+v,j*n+u,w);
add((j-)*n+u,j*n+v,);
add((j-)*n+v,j*n+u,);
}
}
dij();
ll ans=diss[n];
for(int i=;i<=k;i++)
{
ans=min(ll(ans),diss[i*n+n]);
}
cout<<ans; }

min(x3-x1,y3-y1)=x3-x1>=min(x2-x1,y2-y1)+min(x3-x2,y3-y2)
按x轴排序,相邻的点建边,然后建O(n)条
跑dij就行了

最小边越大,最大边越大
最小边变大之后,最大边能选取的范围变小了,且有可能会变大
固定最小边,最小化最大边
并查集维护连通性
先把最小边拿出来,看看能不能加进去,重复操作,直到s和t联通
把最小边从大往小枚举
每次新的边可用的时候,如果连通块正好联通就可以
如果会出环,那么找到u和v之前的路径上最大的边
对于枚举的最小边,看看最大边是谁

1.二分答案
所有长度<=mid的边属于部落内部
>mid的边属于部落外部
看看有多少个连通块
如果连通块数比k多就可行
2.kruscal
n^2连边
把部落看成连通块
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int n,k;
int fa[];
int cnt;
double ans; struct edge
{
int from,to;
double dis;
}edg[]; struct node
{
int x,y;
}nod[]; inline bool cmp(edge a,edge b)
{
return a.dis<b.dis;
} inline int find(int x)
{
while(x!=fa[x]) x=fa[x]=fa[fa[x]];
return x;
} /*inline void kruscal()
{
int t=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=cnt;i++)
{
if(t==n-k)
{
ans=edg[i+1].dis;
return;
}
if(find(edg[i].to)!=find(edg[i].from))
{
fa[find(edg[i].to)]=find(edg[i].from);
t++;
}
} }*/ inline void kruscal()
{
int t=;
bool flag=;
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=cnt;i++)
{
if(t==n-k)
{
flag=;
}
if(find(edg[i].to)!=find(edg[i].from))
{
fa[find(edg[i].to)]=find(edg[i].from);
t++;
if(flag==)
{
ans=edg[i].dis;
return ;
}
} } } int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d%d",&nod[i].x,&nod[i].y);
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
{
edg[++cnt].from=i;
edg[cnt].to=j;
edg[cnt].dis=sqrt((nod[i].x-nod[j].x)*(nod[i].x-nod[j].x)+(nod[i].y-nod[j].y)*(nod[i].y-nod[j].y));
}
}
sort(edg+,edg++cnt,cmp);
kruscal();
printf("%.2lf",ans);
}
选一条边表示两个点属于同一个连通块
目标就是选若干条边使得图分成k个连通块,并且没有选中的边的最小值尽可能大
kruscal选中n-k条边就停止

知道了一个点的奇偶性就可以看出来它有没有
1,1~2,1~3,...,1~n的奇偶性就可以知道所有的奇偶性
前缀和任何一个可行的方案一定可以推出s1~sn
如果我询问了l~r,则我可以知道s[r]-s[l-1]的奇偶性
%2意义下加法就是异或
有传递性
如果我知道s[x]和s[y]奇偶相同,s[y]和s[z]奇偶相同,则s[x]和s[z]奇偶相同
已经知道s[0]=0
目的就是s[1]~s[n]的所有点和s[0]联通起来
有n^2条边,n+1个点,跑最小生成树就行了

贪心策略:在每一个点去往最近的加油站
以所有加油站为源点跑多源最短路,顺便维护最初的源点,现在知道每一个加油站离他最近的源点
可以看成在加油站之间的移动
枚举原图的边,如果两点最近加油站不同,就连边
对加油站跑最小生成树


留下最短路图的公共部分
留下有向边
一定无环(DAG)
求dag上最长路,拓扑+dp



设a1是最小的,在模a1意义下一个数的所有取值只有0~a1-1
而如果 k 是可被表示的,那么 k + a[1], k + 2 × a[1], . . . 都可被表示。故问题转化为求解每个位置最小可被表示数字。建a1个点
x-->(x+aj)%ai(相当于每次+aj)
就可以转移模数
希望走的边的长度尽可能小
大于这个东西就可以表示
加边之后从零点跑单源最短路
线形基
给你若干个int,把他们抑或起来,最后异或出来的数是有限的
发现原来的数是很冗余的,只需要其中某些数就可以达到原来的效果
1 xor 2 = 3 1,2,3是线性相关的 或者说 1 xor 2 xor 3 = 0
就是说保留两个就可以出来第三个
线性基是拟阵
遗传性,交换性
每一个数分配权值
给你一个集合
找到一个子集使得它的权值最小并且是线性基
怎么解释生成森林和线性基对应
每一条边对应二进制
当且仅当环异或起来是0

k条边最短路
具有结合律
可以求出A^1,A^2,A^4...
也可以快速幂

O(n^3logn)
应用:
给你一张图,判断最小的负环
求A^1,A^2,A^3...有没有负环,如果有的话就是最小的
可以二分优化
用倍增的思想往上跳
DAY 7 上午的更多相关文章
- SSH-Struts第三弹:传智播客视频教程第一天上午的笔记
一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...
- JAVA判断当前时间是上午am还是下午pm
//结果为"0"是上午 结果为"1"是下午 public class GregorianTest { public static void main(Strin ...
- PKUSC 模拟赛 day2 上午总结
今天上午考得不是很好,主要还是自己太弱QAQ 开场第一题给的图和题意不符,搞了半天才知道原来是走日字形的 然后BFS即可 #include<cstdio> #include<cstr ...
- PKUSC 模拟赛 day1 上午总结
思考了一下第二题,觉得有无数种乱搞做法 类似什么bitset压位,MCS染色之类奇怪的做法 然而都是玄学正确性或者玄学复杂度 先放题解把 第一题显然具有单调性,二分就可以啦 O(nlogn),貌似输出 ...
- 第一天上午——HTML网页基础知识以及相关内容
今天上午学习了HTML基础知识以及相关内容,还有DW的基本使用方法. HTML(HyperText Markup Language):超文本标记语言,超文本:网页中除了包含文本文字之外,还包含了图片, ...
- 九月 26, 2017 10:18:14 上午 com.sun.jersey.server.impl.application.RootResourceUriRules <init> 严重: The ResourceConfig instance does not contain any root resource classes.
Tomcat启动错误:九月 26, 2017 10:18:14 上午 com.sun.jersey.server.impl.application.RootResourceUriRules <i ...
- 夏令营提高班上午上机测试 Day 2 解题报告
那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧…… 是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...
- Day 1 上午
唉,上午就碰到一个开不了机的电脑,白白浪费了半个小时,真的难受QwQ POINT1 枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些 ...
- 云栖大会day2总结 上午
第二天上午主要是参与了开发者专场 上 09:00-09:40 线上线下融合时代的工程师成长 李佩 饿了么高级算法总监 09:40-10:20 如何统一阿里巴巴代码规范:探寻工程师文化之路 玄坛 阿里巴 ...
- iOS 根据时间戳计算聊天列表的时间(上午/下午)
把时间戳转成聊天时间(上午 10:00 . 昨天 14:00 . 3月15日 15:00) +(NSString*)ChatingTime:(NSString *)timestring{ int ...
随机推荐
- 01Spring基于xml的IOC配置--入门
01Spring基于xml的IOC配置 1.创建一个普通的maven工程 1.1 选择maven,不用骨架,点击下一步. 1.2 填写GroupId.ArtifactId.Version.填完点击下一 ...
- OCR(光学字符识别)技术简介
OCR技术起源 OCR最早的概念是由德国人Tausheck最先提出的,1966年他们发表了第一篇关于汉字识别的文章,采用了模板匹配法识别了1000个印刷体汉字.早在60.70年代,世界各国就开始有OC ...
- XXE漏洞攻击与防御
转自https://www.jianshu.com/p/7325b2ef8fc9 0x01 XML基础 在聊XXE之前,先说说相关的XML知识吧. 定义 XML用于标记电子文件使其具有结构性的标记语言 ...
- Ubuntu:MySQL与phpmyadmin安装、配置并使用。
0. 小建议 Ubuntu 16.04.因为MySQL对于Ubuntu 18.04不是很适配,会出现终端MySQL无法输入中文等问题.如果用Ubuntu 18.04,会需要多解决很多细节问题. 建议将 ...
- Linux之RedHat7如何更换yum源
目前,我们常见的系统大概就是Windows.Linux和Mac OS了.Windows系统应该是大部分人最早开始接触的系统,毕竟Windows系统使用起来相当方便,只需要点点鼠标,外加会简单的打字,一 ...
- nginx的服务架构
nginx服务架构 模块 习惯上将nginx的模块分成核心模块,HTTP模块,邮件模块,以及第三方模块 核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理错误日志解析,配置解析:另 ...
- C Make a Square Educational Codeforces Round 42 (Rated for Div. 2) (暴力枚举,字符串匹配)
C. Make a Square time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...
- ubuntu 添加新用户并赋予root权限
1 sudo adduser wolbo 2 sudo vim /etc/sudoers root ALL=(ALL) ALLwolbo ALL=(ALL) ALL wolbo ALL=(ALL) N ...
- 彻底解决 TypeScript 报错:“无法重新声明块范围变量”的问题
背景 当使用 TypeScript + TSlint + Babel + Jest 搭建开发环境时,在开发过程中偶尔会被 IDE 提示「无法重新声明块范围变量」,从而导致编译出错,报错图示如下: 相关 ...
- Yii和ThinkPHP对比心得
本人小菜鸟一只,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,服务器)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人可以进来交流.寻求共同发展 ...