要问是否存在一个总权重为负数的环,用dfs即可解决。

time:33ms

 #include <cstdio>
#include <cstring>
#define N 3000
using namespace std;
int n, m, T, w[N], u[N], v[N], next[N], first[N], pa[N], d[N], tag, i; void read_graph(void)
{
for(int e = ; e < m; e++)
{
scanf("%d%d%d",&u[e], &v[e], &w[e]);
next[e] = first[u[e]];
first[u[e]] = e;
}
}
void dfs(int x, int fa, int dis)
{
pa[x] = fa;
d[x] = dis;
for(int e = first[x]; e != -; e = next[e])
if(tag) return;
else if(pa[v[e]] == -)//这里应该改为pa[v[e]] != x ,要考虑到负权上的点可能事先被访问过,感谢提出
{
if(v[e] == i && d[x] + w[e] < )
{
puts("possible"), tag = ;
return ;
}
if(v[e] == i)
continue;
dfs(v[e], x, d[x] + w[e]);
}
}
int main(void)
{
scanf("%d", &T);
while(T--)
{
memset(first, -, sizeof(first));
tag = ;
scanf("%d%d", &n, &m);
read_graph();
for(i = ; i < n; i++)
{
memset(d, , sizeof(d)), memset(pa, -, sizeof(pa)),
dfs(i, -, );
if(tag)
break;
}
if(!tag)
puts("not possible");
}
return ;
}

 或者采用bellman—ford算法判断负权回路,

第n次循环时,若d[y]>d[x] + w[i],也就是能够继续松弛下去说明图中存在负权回路。

time:44ms速度还慢了一点,相比dfs

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define INF 0x0f0f0f0f
#define MAXN 1111
#define MAXM 2222
using namespace std; int d[MAXN];
int u[MAXM], v[MAXM], w[MAXM], next[MAXM], first[MAXM];
int t, n, m, e;
void read_graph(void)
{
scanf("%d%d",&n, &m);
for(e = ; e < m; e++)
{
scanf("%d%d%d",&u[e], &v[e], &w[e]);
next[e] = first[u[e]];
first[u[e]] = e;
}
}
void bellman_ford(void)
{
int i;
for(int k = ; k < n-; k++)
for(i = ; i < e; i++ )
{
int x = u[i], y = v[i];
if(d[x] < INF)
d[y] = min(d[y], d[x] + w[i]);
}
for(i = ; i < e; i++)
{
int x = u[i], y = v[i];
if(d[y] > d[x] + w[i])
{
puts("possible");
break;
}
}
if(i == e)
puts("not possible");
}
int main(void)
{
scanf("%d",&t);
while(t--)
{
memset(d, 0x0f, sizeof(d));
memset(first, -, sizeof(first));
d[] = ;
read_graph();
bellman_ford();
}
return ;
}

然后是spfa算法求解是否存在负权回路,通过判断顶点出队次数大于顶点数n,可知存在负权路,源点的time[0]应该初始化为1,其他的点每松弛一次,次数增加。

time:77ms竟然比bellman—ford,自己写的dfs倒是成了最快的了。

 #include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define MAXN 1111
#define MAXM 2222
using namespace std; struct edgeType{
int v, w;
edgeType(int a, int b):v(a), w(b){}
};
int n,m,t;
int time[MAXN], inq[MAXN], d[MAXN]; vector <edgeType> g[MAXN]; bool spfa(void)
{
queue <int> q;
time[] = ;
q.push();
inq[] = ;
while(!q.empty())
{
int x = q.front();
q.pop();
inq[x] = ;
for(int i = ; i < (int)g[x].size(); i++)
if(d[g[x][i].v] > d[x] + g[x][i].w)
{
d[g[x][i].v] = d[x] + g[x][i].w;
time[g[x][i].v]++;
if(time[g[x][i].v] == n + )
return false;
if(!inq[g[x][i].v])
{
q.push(g[x][i].v);
inq[g[x][i].v] = ;
}
}
}
return true;
}
int main(void)
{
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
int a, b, c;
memset(time, , sizeof(time));
memset(inq, ,sizeof(inq));
memset(d, 0x0f,sizeof(d));
d[] = ;
for(int i = ; i < MAXN; i++)
g[i].clear();
for(int i = ; i < m;i++)
{
scanf("%d%d%d", &a, &b, &c);
g[a].push_back(edgeType(b, c));
}
if(spfa())
puts("not possible");
else puts("possible");
}
return ;
}

                                                                 

UVA 558 Wormholes的更多相关文章

  1. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  2. UVA 558 Wormholes 【SPFA 判负环】

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  3. UVA - 558 Wormholes (SPEA算法模板题)

    先给出题面:https://vjudge.net/problem/UVA-558 题意描述:给你含n个点以及m条边的图,让你判断在这个图中是否存在负权回路. 首先,我们来介绍什么是SPEA算法 SPF ...

  4. UVA 558 判定负环,spfa模板题

    1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...

  5. uva 558 tree(不忍吐槽的题目名)——yhx

    You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...

  6. uva 558 Bellman_Ford

    Bellman_Ford算法   求图中是否存在负权值的回路   若图中不存在   则最短路最多经过n-1个结点   若经过超过n-1个节点 则存在负权值的回路  此图永远无法找到最短路  每条边最多 ...

  7. UVA 558 SPFA 判断负环

    这个承认自己没看懂题目,一开始以为题意是形成环路之后走一圈不会产生负值就输出,原来就是判断负环,用SPFA很好用,运用队列,在判断负环的时候,用一个数组专门保存某个点的访问次数,超过了N次即可断定有负 ...

  8. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  9. UVa 10012 - How Big Is It? 堆球问题 全排列+坐标模拟 数据

    题意:给出几个圆的半径,贴着底下排放在一个长方形里面,求出如何摆放能使长方形底下长度最短. 由于球的个数不会超过8, 所以用全排列一个一个计算底下的长度,然后记录最短就行了. 全排列用next_per ...

随机推荐

  1. GlusterFS集群文件系统概述

    http://blog.csdn.net/zonelan/article/details/8468383 1.      GlusterFS概述 GlusterFS是Scale-Out存储解决方案Gl ...

  2. ACM——快速排序法

    快速排序 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:653            测试通过:297 描述 给定输入排序元素数目 ...

  3. Android之Http网络编程(一)

    Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式. 在Android中http网络编程中有两种实现方式,一种是使用HttpURLC ...

  4. MySql 5.7密码查看或修改

    一.启动命令行,输入: taskkill /f /im mysqld.exe //关闭mysql 二.转入mysql的bin目录下 三.输入:mysqld --skip-grant-tables // ...

  5. netbeans环境中使用maven搭建jsf、primefaces工程

    新建maven工程,选择web工程 增加jsf框架,加入primefaces 部署到服务器,在浏览器中打开页面,这是primefaces框架的页面. 此时工程web目录下有如下文件 web.xml文件 ...

  6. yield关键字的用法

    在上一篇文章中,说了下foreach的用法,但是还是比较复杂的,要实现接口才能进行遍历,有没有简单些的方法呢?答案是肯定的.且看下面. yield关键字的用法: 1.为当前类型添加一个任意方法,但是要 ...

  7. ASP.NET Web API——选择Web API还是WCF

    WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WCF的设计主要是考 ...

  8. java包和jar包

    1.包 package  pack;                             /*定义包,放在程序的第一行,包名所以字母小写*/ class PackageDemo{    publi ...

  9. treeview OnSelectedNodeChanged js的方法

    可以在OnSelectedNodeChanged的cs中,对node赋值如此: nod.Text = "<span onclick=''>" + node名称 + &q ...

  10. 解决jquery mobile的遇到高版本Chrome一直转圈,页面加载不出来的情况。

    把这么一段代码,加到jquery.mobile.js中后问题解决了. $(document).on('mobileinit',function(){ $.mobile.changePage.defau ...