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. BFS-基础简单的算法

    前言 有时候,当你并不了解很多高级算法的时候,搜索不失为一种解决问题的好方法,而且很多高级算法有或多或少的会用到搜索或者搜索的思想.可见,搜索是一个基础并且必须要掌握的算法. 在这篇文章中,会对BFS ...

  2. C++中的动态链接库

    一,动态链接库的基本概念 1.DLL(Dynamic Linker Library)的概念 可以把DLL看做是一个仓库,它提供了一些可以直接拿来用的变量,函数或者类(但是不建议从DLL中获取变量),在 ...

  3. (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...

  4. PHP生成随机水印图片

    基于PHP的GD图形库,自己生成一张图片.仅限初识GD库,实例学习. 一.需求 网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介.因为课程的数量较大没有为所 ...

  5. Java完成简单猜数字游戏v2.0

    猜数字游戏v2.0 优化了获取随机数.输入数据超出边界值的代码,并增加了异常处理,能够在玩家输入错误数据错误时给出可靠指引,希望对和我一样的新人有帮助, 最后希望有大神愿意帮我解决代码优化的问题,谢谢 ...

  6. 【子非鱼】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  7. win32最简单的htmlayout图形界面demo

    1,下载HTMLayoutSDK,放在workspace. SDK下载地址:http://www.terrainformatica.com/htmlayout/HTMLayoutSDK.zip 2,v ...

  8. Jquery EasyUI远程校验,Jquery EasyUI多个自定义校验,EasyUI自定义校验

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  9. net.sz.framework 框架 轻松搭建服务---让你更专注逻辑功能---初探

    前言 在之前的文章中,讲解过 threadmodel,socket tcp ,socket http,log,astart ,scripts: 都是分片讲解,从今天开始,将带大家,一窥 net.sz. ...

  10. C语言 动态数组实现

    一.概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度. 如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组. 二.动态内存分配函 ...