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

内容真的多。。。

一个一个来吧。

首先是最小生成树。

先讲一下生成树的定义

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

那么我们要求的最小生成树有两种算法可以求: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. POJ:2100-Graveyard Design(尺取)

    Graveyard Design Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 8504 Accepted: 2126 Cas ...

  2. [Codeforces958A2]Death Stars (medium)(字符串+hash)

    Description 题目链接 Solution 这里用类似hash的方法将判断2个矩阵是否相同的时间降为O(m),总时间复杂度为O(m3) Code #include <cstdio> ...

  3. saltstack执行远程命令

    目录 Remote Execution salt state salt state 系统 salt state 系统流程 Runner salt runner Orchestrate Runner S ...

  4. The Image Gallery Revisited

    Lets apply the Best practices to the Image Gallery . /*** index.html ***/ <!DOCTYPE html> < ...

  5. 11.2,nginx负载均衡实验

    Nginx负载均衡概述 Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现 ...

  6. 110Balanced Binary Tree

    问题:判断二叉树是否为平衡二叉树分析:树上的任意结点的左右子树高度差不超过1,则为平衡二叉树.         搜索递归,记录i结点的左子树高度h1和右子树高度h2,则i结点的高度为max(h1,h2 ...

  7. JS:关于JS字面量及其容易忽略的12个小问题

    简要 问题1:不能使用typeof判断一个null对象的数据类型 问题2:用双等号判断两个一样的变量,可能返回false 问题3:对于非十进制,如果超出了数值范围,则会报错 问题4:JS浮点数并不精确 ...

  8. AD高级规则设置

    inpolygon 是所有的覆铜 ispad 是焊盘到焊盘的间距 IsVia 过孔间距 ispad and InComponent('S1')    设置某个器件的焊盘间距规则 ispad and H ...

  9. 《Cracking the Coding Interview》——第2章:链表——题目3

    2014-03-18 02:25 题目:给定一个单链表中间的节点,删掉那个节点. 解法:把后面节点的数据域拷到当前节点来,然后删除后面那个节点.当前节点不是尾巴,所以后面不为空. 代码: // 2.2 ...

  10. jeakins用户配置

    进入jeakins:系统管理-全局安全设置 如果有多个用户视情况而定进行权限配置