补坑补坑((╯‵□′)╯︵┻━┻)

内容真的多。。。

一个一个来吧。

首先是最小生成树。

先讲一下生成树的定义

生成树就是在一张图上选取一些边,使得整个图上所有的点都连通。

那么我们要求的最小生成树有两种算法可以求:1、prim算法,2、kruskal算法

我们先讲讲prim算法

prim算法有点像最短路中的dijstra,操作都几乎一样,原理就是从所有在队列中的点出发,找到最小的一条边,并把它连起来,这样子能够保证局部最优性。

在此我不讲这种算法,不过有兴趣的人可以去学一学。

我重点推出的是kruskal算法:原因就是:又短,又好写,而且一点都不难理解。

首先我们先把所有的边都排个序,然后我们从小到大枚举所有的边,如果一条边两端的点不在同一个集合内,那么我们就链接这一条边,并且合并集合(合并集合的操作可以用并查集快速维护)

下面附上代码

#include<cstdio>
#include<algorithm>
#define MN 5005
#define M 200005
using namespace std;
int n,m,cnt=,ans=;
int f[MN];
struct edge{
int u,v,w;
}g[M];
bool cmp(edge a,edge b){return a.w<b.w;}
int getf(int x){return !f[x]?x:f[x]=getf(f[x]);}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d%d",&g[i].u,&g[i].v,&g[i].w);
sort(g+,g+m+,cmp);
for(int i=;i<=m&&cnt<n-;i++){
int x=getf(g[i].u),y=getf(g[i].v);
if(x!=y){
cnt++;
ans+=g[i].w;
f[x]=y;
}
}
if(cnt==n-)printf("%d\n",ans);else puts("orz");
}

如果对于这两种算法不懂的同学们可以去这篇博客上看一看它的图解,我就不献丑啦QAQ(其实是内容太多,比较懒QAQ)

——————————————————我是分割线———————————————————

下面讲一讲负环判断:

我们在上次讲过一次最短路,而我在那一次的讲解中提到过,dij算法是不能在有负环的图中跑的。

这也就意味着,spfa可以。

对于每次spfa中,如果我们不使用循环队列,那么我们的队列元素开的大小就是n*n

这是因为在spfa中,一个点最多入队n次。可是如果我们想,spfa中出现负环会怎么样呢?

显然,环内的点会重复入队,然后T掉。

但这样也说明,如果一个点入队次数超过n次,那么一定有负环出现。

这也就是我们判断负环的方法。

在spfa中我们开一个cnt数组记录每个点入队的次数,如果次数超过n次,那么就存在负环。

由于太过简单,代码我就不贴了QAQ

——————————————————我是分割线———————————————————

最后是差分约束。

差分约束的意思就是说,在一道题中有很多的变量,变量之间满足很多的不等式,然后要我们求解的一系列问题。

我们先来看一看例题。

——————————————————我是分割线———————————————————

题目:

  当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食。奶牛排在队伍中的顺序和它们的编号是相同的。因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上。即使说,如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。 
    一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D。给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶牛间存有反感的描述。(1<=ML,MD<=10000,1<=L,D<=1000000) 
    你的工作是:如果不存在满足要求的方案,输出-1;如果1号奶牛和N号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1号奶牛和N号奶牛间可能的最大距离。

我们先来看一看一个等式,比如题目中要求的第一个等式:d[j]-d[i]<=L,这个等式有没有感觉有点熟悉?细心的人就会发现当d[j]-d[i]>L的时候就要更新答案,这不就是最短路吗!!

是的,这就是最短路,于是我们就将一个数论问题变成了一个图论问题。

所以我们只需要把所有不等式转换为d[i]-d[j]<=L的不等式,然后我们从j到i连一条L的边

然后我们对着这个图直接跑最短路就好了(是不是很棒!)

那么我们又要怎么判断-1呢?这就是我们上面讲的负环判断的应用了。因为如果出现负环,很显然就无法满足条件,那么就是无解情况了。

下面讲两个建图的容易错误的地方;

一个是有时候题目会要求不能有2个人同时站在同一位置上。所以我们有时候需要满足d[i+1]-d[i]>=1不等式

还有就是如果要求A和B相同,那么我们要在AB之间连上双向边。

那么今天的总结就到这里啦。

附上这道例题的代码。

#include<cstdio>
#include<cstring>
#define MN 30005
#define inf 0x3f3f3f3f
#define M 1005
using namespace std;
inline int read()
{
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x;
}
int head[M],cnt[M],dis[M],que[M<<];
int n,ml,md,num,t;
bool visit[M];
struct edge{
int to,next,val;
}g[MN];
void ins(int u,int v,int we){g[++num].next=head[u];head[u]=num;g[num].to=v;g[num].val=we;}
void insw(int u,int v,int we){ins(u,v,we);ins(v,u,we);}
bool spfa(){
for(int i=;i<=n;i++)dis[i]=inf;
memset(visit,,sizeof(visit));
int h=,tail=;que[h]=;dis[]=;
while(h<=tail){
int tmp=que[h++];
for(int i=head[tmp];i;i=g[i].next)
if(dis[g[i].to]>dis[tmp]+g[i].val){
dis[g[i].to]=dis[tmp]+g[i].val;cnt[g[i].to]++;
if(!visit[g[i].to]){
visit[g[i].to]=;
if(cnt[g[i].to]>n)return true;
if(dis[g[i].to]<dis[que[h]])que[--h]=g[i].to;
else que[++tail]=g[i].to;
}
}
visit[tmp]=;
}
return false;
}
int main(){
scanf("%d%d%d",&n,&ml,&md);
int s,t,value;
for(int i=;i<=n;i++)ins(i,i-,);
for(int i=;i<=ml;i++)scanf("%d%d%d",&s,&t,&value),ins(s,t,value);
for(int i=;i<=md;i++)scanf("%d%d%d",&s,&t,&value),ins(t,s,-value);
if(spfa())printf("-1\n");
else if(dis[n]==inf)printf("-2\n");
else printf("%d\n",dis[n]);
}

培训补坑(day5:最小生成树+负环判断+差分约束)的更多相关文章

  1. 培训补坑(day1:最短路&two-sat)

    经过12天的滚粗,终于迎来了暑期培训的结尾啦QAQ 结业考才考了90分,真是对不起孙爷(孙爷请收下我的膝盖) orz小粉兔怒D rank 1 获得小粉兔一只QAQ 由于这次12天的培训题目又比较多,算 ...

  2. 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)

    看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...

  3. spfa负环判断

    正常spfa中加入time数组,循环判断一个点是否入队并更新了n次以上注意是 > n!!其余的没有什么问题 扩展的还有,寻找所有负环上的点,这个可以在spfa中time 发现负环的时候,对那个点 ...

  4. 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)

    补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...

  5. 培训补坑(day2:割点与桥+强联通分量)

    补坑ing... 好吧,这是第二天. 这一天我们主要围绕的就是一个人:tarjan......创造的强联通分量算法 对于这一天的内容我不按照顺序来讲,我们先讲一讲强联通分量,然后再讲割点与桥会便于理解 ...

  6. lightoj 1074 - Extended Traffic(spfa+负环判断)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1074 题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市I到另一个城市J ...

  7. poj-3259 Wormholes(无向、负权、最短路之负环判断)

    http://poj.org/problem?id=3259 Description While exploring his many farms, Farmer John has discovere ...

  8. POJ 1151 Wormholes spfa+反向建边+负环判断+链式前向星

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 49962   Accepted: 18421 Descr ...

  9. 培训补坑(day8:树上倍增+树链剖分)

    补坑补坑.. 其实挺不理解孙爷为什么把这两个东西放在一起讲..当时我学这一块数据结构都学了一周左右吧(超虚的) 也许孙爷以为我们是省队集训班... 好吧,虽然如此,我还是会认真写博客(保证初学者不会出 ...

随机推荐

  1. Teaching Is a Fruitful Way to Learn【教学是一种有效的学习方式】

    Teaching Is a Fruitful Way to Learn For thousands of years, people have known that the best way to u ...

  2. 17-比赛1 B - 子串计算 Chef and his string challenge (string的运用)

    Chef's best friend Jerry gives Chef a string A and wants to know the number of string A that can be ...

  3. git的使用入门

    写作目的: 快速的上手git版本控制+github神器进行基本的版本同步操作. 怎么做? 对于任意一个代码项目,使用git_bash进入到代码目录 如果没有进行过初始化操作:应当使用git init  ...

  4. idea 项目jar包出错

    找到jar包所在文件目录,删除下面的所有文件,刷新maven项目,重新引入jar包

  5. 3195: [Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 链接 思路: 因为一个点只会和它前后k个点连边,所以,记录下每个点的前k个点和它自己(共k+1个点)的状态,1表示奇数,0表示偶数. dp[i][j][s] ...

  6. Android 判断屏幕方向一个大坑

    正常的判断屏幕方向的代码: /** 获取屏幕是否是竖屏 * @return */ @SuppressLint("SwitchIntDef") public boolean isSc ...

  7. U盘的容量变小了怎么办?

    之前买了个U盘,后来给朋友装系统弄成U盘启动盘了,就发现U盘容量变少了几百兆,原来是因为做U盘启动盘的时候,U盘启动盘制作软件都是把写入U盘的PE文件隐藏了,防止用户不小心删除文件. 所以说这些空间应 ...

  8. CandyCrush 糖果传奇

    1.unity自带触发事件 unity的每一个Collider对象都有类似OnMouseDown.OnMouseOver等事件.此事件是存在于MonoBehaviour脚本里的,而MonoBehavi ...

  9. 孤荷凌寒自学python那些事第一天

    孤荷凌寒自学python第一天 初识python (学习过程的完整录像分享链接在文末,手写笔记图片在文末) 一种编程语言,首先是它的语言的基本架构,python总体让人耳目一新: 今天其实只接触到了它 ...

  10. linux服务器基本安全配置手册

    转:忘了在哪转的,直接复制到笔记里了,贴出来分享 假如你想要搭建一个Linux服务器,并且希望可以长期维护的话,就需要考虑安全性能与速度等众多因素.一份正确的linux基本安全配置手册就显得格外重要. ...