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. CSS限制字数,超出部份显示点点点...

    最近项目中需要用CSS实现限制字数,超出部份显示点点点...,只需要一下代码即可: width:400px;/*要显示文字的宽度*/ text-overflow :ellipsis; /*让截断的文字 ...

  2. 搭建ftp服务器实现文件共享

    FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transfer Protocol ...

  3. spring循环依赖问题分析

    新搞了一个单点登录的项目,用的cas,要把源码的cas-webapp改造成适合我们业务场景的项目,于是新加了一些spring的配置文件. 但是在项目启动时报错了,错误日志如下: 一月 , :: 下午 ...

  4. HTML5微数据

    本篇文章是一个纯搬运贴,原博主是在是做的太详细了 原贴地址:http://www.zhangxinxu.com/wordpress/2011/12/html5扩展-微数据-丰富网页摘要/ 一.微数据是 ...

  5. (18)IO流之字节缓冲路

    缓冲流 BufferedInputStream 缓冲输入流 前面的练习告诉我们使用缓冲数组读取的效率更高,为了方便的大家的操作,sun 位大家提供了一个缓冲输入字节流对象,让我们可以更高效率的读取文件 ...

  6. (8)集合之List,ArrayList,LinkedList

    集合的体系结构 Collection 单列集合的接口 |----List 如果实现了List接口的集合类,具备的特点是有序,可重复 |----Set 如果实现了Set接口的集合类,集合特点无序不可重复 ...

  7. 关于php的flush在本机正常在服务器不灵的问题

    这个问题网上很多,我就不重复那些了. 我的是关于进度条的应用.我最后遇到的问题是,在本机swampserver环境下的输出缓存很快,但是到了服务器上就是一段一段的了.我的服务器是Web服务器是IIS. ...

  8. ATM取款~~

    package com.jredu.ch03; import java.util.Scanner; public class Atmmmmmmmmmm { static int totalMoney= ...

  9. SSH自动断开连接的原因、配置(转)

    方法一: 用putty/SecureCRT连续3分钟左右没有输入, 就自动断开, 然后必须重新登陆, 很麻烦. 在网上查了很多资料, 发现原因有多种, 环境变量TMOUT引起,ClientAliveC ...

  10. [C++]STL容器Vector的内存释放

    直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...