https://vjudge.net/contest/66569#problem/F

题意:判断图中是否存在负权回路

首先,介绍图的邻接表存储方式

数据结构:图的存储结构之邻接表

邻接表建图,类似于头插法建单链表

head[x]:以x为源点的第一条边,初始值为-1.

struct edge

{

  int to;

  int weight;

  int next;
}e[maxn];

to表示被指向的点;weight表示这条边的权重;next表示源点同为x的下一条边,这是遍历以x为源点的的关键

SPFA算法中的队列与BFS不同的是,每个点都可以在重复进入队列,而且进入队列总次数大于顶点总数说明该图存在负环。这是因为每个点的估计最短路可能在出队列后被更新,这样这个点就可以再次进入队列去更新其他点。

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
const int inf=0x3f3f3f3f;
int n,m,w;
struct edge
{
int to;
int time;
int next;
}e[maxn];
int head[]; int Spfa(int src)
{
//记录每个顶点到src的距离,除了src,其余点都初始化为无穷大
int dis[];
memset(dis,inf,sizeof(dis));
dis[src]=;
//记录每个顶点进入队列的总次数,大于n说明有负环
int cnt[];
memset(cnt,,sizeof(cnt));
//记录是否在队列中
bool inque[];
memset(inque,,sizeof(inque));
queue<int> Q;
//源点进如队列
Q.push(src);
inque[src]=;
cnt[src]++;
while(!Q.empty())
{
int q=Q.front();
Q.pop();
//记录已经出队列
inque[q]=;
//邻接表,i表示边
for(int i=head[q];i!=-;i=e[i].next)
{
//对每个点进行松弛,逐渐逼近最小值
if(dis[q]+e[i].time<dis[e[i].to])
{
dis[e[i].to]=dis[q]+e[i].time;
//如果更新成功而且当前不在队列中,进入队列且总次数加1
if(!inque[e[i].to])
{
inque[e[i].to]=;
cnt[e[i].to]++;
Q.push(e[i].to);
//说明存在负环
if(cnt[e[i].to]>n)
{
return ;
}
}
}
}
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
int x,y,t;
while(T--)
{
memset(head,-,sizeof(head));
scanf("%d%d%d",&n,&m,&w);
int tot=;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&t);
e[tot].to=y;
e[tot].time=t;
e[tot].next=head[x];
head[x]=tot++;
e[tot].to=x;
e[tot].time=t;
e[tot].next=head[y];
head[y]=tot++;
}
for(int i=;i<=w;i++)
{
scanf("%d%d%d",&x,&y,&t);
e[tot].to=y;
e[tot].time=-t;
e[tot].next=head[x];
head[x]=tot++;
}
int ans=Spfa();
if(ans==)
{
puts("YES");
}
else
{
puts("NO");
}
}
return ;
}

邻接表+SPFA

理论上以任意一点为源点都是可以的,顶点的数据范围是1~N,所以Spfa(1)或Spfa(n)都可以AC,其他的具体值不可以

【算法系列学习】SPFA邻接表最短路 [kuangbin带你飞]专题四 最短路练习 F - Wormholes的更多相关文章

  1. 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

    https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 ...

  2. 【算法系列学习】Dijkstra求最短路 [kuangbin带你飞]专题四 最短路练习 D - Silver Cow Party

    https://vjudge.net/contest/66569#problem/D trick:1~N各点到X可以通过转置变为X到1~N各点 #include<iostream> #in ...

  3. 【算法系列学习】Dijkstra算法变形 [kuangbin带你飞]专题四 最短路练习

    https://vjudge.net/contest/66569#problem/B 类试题:noip2013 货物运输 POJ 1797 Heavy Transportation 方法一:Dijks ...

  4. 【算法系列学习】DP和滚动数组 [kuangbin带你飞]专题十二 基础DP1 A - Max Sum Plus Plus

    A - Max Sum Plus Plus https://vjudge.net/contest/68966#problem/A http://www.cnblogs.com/kuangbin/arc ...

  5. [kuangbin带你飞]专题四 最短路练习

    对于最短路,我主要使用的就是dijkstra,Floyd,SPFA这三个算法.先来介绍一下这三个算法. 1. dijkstra算法.它适用于边权为正的情况,它是单源最短路,就是从单个源点出发到所有的结 ...

  6. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题四 最短路练习 POJ 3259 Wormholes

    SPFA求负环 模板题 记得每组处理之前clear vector /* *********************************************** Author :Sun Yuef ...

  7. [kuangbin带你飞]专题四 最短路练习 POJ 3268 Silver Cow Party

    题意: 在一个有向图中求n头牛从自己的起点走到x再从x走回来的最远距离 思路一开始是暴力跑dij…… 讲道理不太可能…… 然后就百度了一下 才知道把矩阵转置的话就只需要求两次x的单源最短路…… /* ...

  8. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题四 最短路练习 POJ 2387 Til the Cows Come Home

    求1到N的最短路 注意有重边 跑一遍dijkstra就行 /* *********************************************** Author :Sun Yuefeng ...

  9. [kuangbin带你飞]专题四 最短路练习 POJ 1797 Heavy Transportation

    求每条道路的最大承载量 和上一道题差不多 就是松弛的规则从最大值变成了最小值 /* *********************************************** Author :Su ...

随机推荐

  1. 【js数据结构】栈解决佩兹糖果盒问题

    现实生活中栈的一个例子是佩兹糖果盒. 想象一下你有一盒佩兹糖果, 里面塞满了红色. 黄色和白色的糖果, 但是你不喜欢黄色的糖果. 使用栈( 有可能用到多个栈) 写一段程序, 在不改变盒内其他糖果叠放顺 ...

  2. 【微信公众平台SDK(链式调用)】经过半个月的迭代,今天抽空写了个Demo

    这个项目是在实际开发中逐渐完善的,开发过程基于ASP.Net Core 1.1,实际生成会兼容Net4.5. 写有完善的代码提示,怎么用就不多做解释了,引用好实例中的命名空间基本上就可以通过智能提示了 ...

  3. Apache无法启动原因

    Apache不能启动解决办法 作者的话:遇到这个问题的时候,从网上找了很多资料,结果都是让我这个新手摸不着头绪 还好,在我长时间的查找下,还是找到了一篇文章,解决了我的烦恼,下面是我对这个文章的一些对 ...

  4. 第一天—ListView||内容提供者

    ###ListView1.创建一个ListView的控件2.在Layout包中创建一个布局,用来指定ListView每个条目的布局 例:Item3.找到ListView控件4.创建一个类继承适配器三个 ...

  5. 关于数组和集合的冒泡排序中容易出现的IndexOutOfBoundsException

    数组只能存错一种相同的数据类型,集合只能存储引用数据类型(用泛型),集合的底层就是一个可变的数组. 数组的冒泡排序: public static void arrayMaxPaiXu(int[] ar ...

  6. ajax使用及代码表示

    最近学习了ajax,记录一下学习写过的代码和一些问题 一.原生ajax var xhr = null; if(window.XMLHttpRequest) { xhr = new XMLHttpReq ...

  7. Linux shell指令运行的原理

    shell是一种命令行解释器 对于一般用户,我们不能直接使用操作系统(kernel).而是通过 kernel的"外壳"程序,也就是所谓的shell,来与kernel沟通.    为 ...

  8. servlet学习总结(一)——初识Servlet

    Servlet工作过程 当客户端向web服务器发送servlet请求时,web服务器首先检查是否已经加载并创建了servlet实例对象.如果没有会装载并创建该Servlet的一个实例对象.然后调用se ...

  9. JDBC基础学习(四)—数据库事务

    一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...

  10. scss实现不同方向的三角

    //定义一个三角的函数 实现不同方向的三角加兼容ie6//第一个参数传入方向//第二个参数传入大小//第三个参数传入颜色//注意:传入参数中间必须逗号分隔@mixin triangle($x, $y: ...