Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 38300   Accepted: 14095 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way p…
Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24249   Accepted: 8652 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way pa…
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己. 思路: 这题就是判断存不存在负环回路. 前M条是双向边,后面的W是单向的负边. 为了防止出现不连通,增加一个结点作为起点.起点到所有点的长度为0 #include <iostream> #include <stdio.h> #include <string.h>…
在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形式上,它看起来特别像堆优化Dijkstra算法罢了! Bellman-Ford算法会遍历所有边并进行松弛操作,然而我们应该知道很多的更新是无用的,所以我们的优化就体现在这里,因为只有那些前一步被更新的点,它所连接的点才有被更新的意义,所以我们会将被更新的点放入一个队列中: 注意点: 1) st数组的…
MARK 用spfa判断是否存在负环 判断是否存在负环的方法有很多, 其中用spfa判断的方法是:如果存在一个点入栈两次,那么就存在负环. 细节想想确实是这样,按理来说是不存在入栈两次的如果边权值为正的话 这个算法是O(N*M) 还有一种方法是直接用bellman-ford,虽说spfa也就是bellman-ford+FIFO队列 而且bellman-ford还可以计算负环的值 顺手附上代码好了: for(int i=0;i<n;i++) d[i]=INF;//初始化 d[0]=0; for(i…
题目链接:http://poj.org/problem?id=3259 题目大意:一个图,有n个顶点,其中有m条边是双向的且权值为为正,w条边是单向的且权值为负,判断途中是否存在负环,如果有输出YES,没有输出NO. Sample Input 2 3 3 1 1 2 2 1 3 4 2 3 1 3 1 3 3 2 1 1 2 3 2 3 4 3 1 8 Sample Output NO YES 解题思路:套用Bellman_Ford算法判断图是否存在负环具体详见代码: #include<iost…
题目:http://poj.org/problem?id=3259 题意:主要就是构造图, 然后判断,是否存在负图,可以回到原点 /* 2 3 3 1 //N, M, W 1 2 2 1 3 4 2 3 1 3 1 3 //虫洞 3 2 1 //N, M, W 1 2 3 2 3 4 3 1 8 */ #include <iostream> #include <cstring> using namespace std; + + ) * + ; + ; int N, M, W; //…
如果存在最短路径的边数大于等于点数,就有负环 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你判断图中是否存在负权回路. 输入格式 第一行包含整数n和m. 接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z. 输出格式 如果图中存在负权回路,则输出"Yes",否则输出"No". 数据范围 1≤n≤20001≤n≤2000,1≤m≤100001≤m≤10000,图中涉及边长绝对值均不超过10000. 输入样例…
/* 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 出现了回路!用这种方法必须将重边去除掉! 所以推荐用dfs方式进行判断!这种方式还是比较直观的! */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace st…
#include <iostream> #include <vector> #include<string> #include<cstring> using namespace std; # define ll long long # define maxn 1000+10 # define inf 0x3f3f3f3f int n,m,t; double mg; struct node { int to; double lv; double yon; no…