一些图论的题目


BZOJ 3445 Roadblock

求出最短路,枚举每条边再跑一遍即可(科技为了我

代码:

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

  1. SSH-Struts第三弹:传智播客视频教程第一天上午的笔记

    一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...

  2. JAVA判断当前时间是上午am还是下午pm

    //结果为"0"是上午 结果为"1"是下午 public class GregorianTest { public static void main(Strin ...

  3. PKUSC 模拟赛 day2 上午总结

    今天上午考得不是很好,主要还是自己太弱QAQ 开场第一题给的图和题意不符,搞了半天才知道原来是走日字形的 然后BFS即可 #include<cstdio> #include<cstr ...

  4. PKUSC 模拟赛 day1 上午总结

    思考了一下第二题,觉得有无数种乱搞做法 类似什么bitset压位,MCS染色之类奇怪的做法 然而都是玄学正确性或者玄学复杂度 先放题解把 第一题显然具有单调性,二分就可以啦 O(nlogn),貌似输出 ...

  5. 第一天上午——HTML网页基础知识以及相关内容

    今天上午学习了HTML基础知识以及相关内容,还有DW的基本使用方法. HTML(HyperText Markup Language):超文本标记语言,超文本:网页中除了包含文本文字之外,还包含了图片, ...

  6. 九月 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 ...

  7. 夏令营提高班上午上机测试 Day 2 解题报告

    那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧……   是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...

  8. Day 1 上午

    唉,上午就碰到一个开不了机的电脑,白白浪费了半个小时,真的难受QwQ POINT1 枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些 ...

  9. 云栖大会day2总结 上午

    第二天上午主要是参与了开发者专场 上 09:00-09:40 线上线下融合时代的工程师成长 李佩 饿了么高级算法总监 09:40-10:20 如何统一阿里巴巴代码规范:探寻工程师文化之路 玄坛 阿里巴 ...

  10. iOS 根据时间戳计算聊天列表的时间(上午/下午)

    把时间戳转成聊天时间(上午 10:00  .  昨天 14:00 . 3月15日 15:00) +(NSString*)ChatingTime:(NSString *)timestring{ int ...

随机推荐

  1. springmvc中的参数接收

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...

  2. 2019-11-29-dotnet-使用-Qpush-快速从电脑到手机推送文字

    title author date CreateTime categories dotnet 使用 Qpush 快速从电脑到手机推送文字 lindexi 2019-11-29 08:58:57 +08 ...

  3. spring boot基础学习教程

    Spring boot 标签(空格分隔): springboot HelloWorld 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 ...

  4. Linux抓包与扫描工具

    一.nmap扫描工具介绍: 1.安装nmap,如下: 2.检查目标主机所开启的TCP服务: 3.检查x.x.x.x/24网段内哪些主机开启了FTP.SSH服务 二.使用tcpdump分析 1.执行FT ...

  5. MYSQL explain详解[转载]

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 虽然这篇文章我写的很长,但看起来真的不会困啊,真的都是干货啊!!!! 先解析 ...

  6. 并查集 || [USACO18JAN]MooTube || BZOJ 5188 || Luogu P4185

    题面:[USACO18JAN]MooTube 题解: 对边和询问都排序,然后每次把符合当前要求的边都扔并查集里,对于每个询问判断当前并查集里节点数即可. 我很无聊地给并查集加了按秩排序,还开了O2,加 ...

  7. mysql远程不能连接问题

    解决Navicat无法连接到腾讯云MySQL的问题 工具/原料   Navicat phpstudy 腾讯云 Xshell6 方法/步骤   1 1.首先远程连接进入服务器,在cmd中输入mysql ...

  8. RabbitMQ之消息持久化(队列持久化、消息持久化)

    rabbitMQ不支持数据库的持久化,只支持内存以及文件持久化 https://blog.csdn.net/bwh0520/article/details/78746873 http://blog.y ...

  9. Error: unable to perform an operation on node 'rabbit@DESKTOP-6JT7D2H'. Please see diagnostics information and suggestions below.

    https://blog.csdn.net/qq_32814555/article/details/79494533

  10. 2017年全国卷3的21题与2018年全国卷3的21题命题背景是同一个函数$y=\frac{2x}{\ln(x+1)}$(再次瞎谈)

    2017年四川高考数学(全国卷3)理科21题第1问 已知函数\(f(x)=x-1-a\ln x\) (1)若\(f(x)\geqslant 0\),求\(a\)的值\(.\) 该不等式等价于$a\ln ...