题目连接

http://poj.org/problem?id=3259

思路

大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500,卡了巨久,但是用Floyd也是能过的,只不过写的时候要注意自己的常数,常数打了就过不了了,但是想到判负环我们应该联想到spfabellman算法,详情请看:spfa和bellman判负环,由于spfa算法是优化后的bellman所以我这里就不放bellman的代码了

代码

Floyd算法

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;const int INF = 0x3f3f3f3f;
const int N = 1e3+10;int n,m,w;
int f[N][N];bool floyd(){for(int k = 1;k <= n; ++k)for(int i = 1;i <= n; ++i){for(int j = 1;j <= n; ++j)if(f[i][j] > f[i][k] + f[k][j])f[i][j] = f[i][k] + f[k][j];if(f[i][i] < 0) return true;}return false;
}void slove(){scanf("%d%d%d",&n,&m,&w);int u,v,k;for(int i = 1;i <= n; ++i)for(int j = 1;j <= n; ++j)f[i][j] = (i == j?0:INF);for(int i = 1;i <= m; ++i) {scanf("%d%d%d",&u,&v,&k);if(f[u][v] > k)f[u][v] = f[v][u] = k;}for(int i = 1;i <= w; ++i) {scanf("%d%d%d",&u,&v,&k);f[u][v] = -k;}if(floyd()) puts("YES");else puts("NO");
}int main(){int t;scanf("%d",&t);while(t--)slove();return 0;
}

spfa算法

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3fint dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};ll ksm(ll a,ll b) {ll ans = 1;for(;b;b>>=1LL) {if(b & 1) ans = ans * a % mod;a = a * a % mod;}return ans;
}ll lowbit(ll x){return -x & x;}const int N = 2e6+10;
//----------------自定义部分----------------
int n,m,q,w;vector<PII> E[N];
int dis[N],cnt[N];
bool vis[N];void spfa(){queue<int> que;for(int i = 1;i <= n; ++i) que.push(i);while(!que.empty()){int t = que.front();que.pop();vis[t] = false;//表明t这个点已经离开这个队列了for(int i = 0,l = E[t].size();i < l; ++i) {int j = E[t][i].first,k = E[t][i].second;if(dis[j] > dis[t] + k) {dis[j] = dis[t] + k;cnt[j] = cnt[t] + 1;if(cnt[j] >= n) {//找到负环puts("YES");return;}if(!vis[j])//将j这个点重新加入队列que.push(j),vis[j] = true;}}}puts("NO");
}void init(){for(int i = 1;i <= n; ++i) E[i].clear(),vis[i] = true,cnt[i] = 0;
}void slove(){scanf("%d%d%d",&n,&m,&w);init();int u,v,k;for(int i = 1;i <= m; ++i) {scanf("%d%d%d",&u,&v,&k);E[u].push_back({v,k});E[v].push_back({u,k});}for(int i = 1;i <= w; ++i){scanf("%d%d%d",&u,&v,&k);E[u].push_back({v,-k});}spfa();
}int main()
{int t;scanf("%d",&t);while(t--) slove();return 0;
}

AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)相关推荐

  1. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  2. 【2019icpc南京站网络赛 - H】Holy Grail(最短路,spfa判负环)

    题干: As the current heir of a wizarding family with a long history,unfortunately, you find yourself f ...

  3. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  4. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详(并不)解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多 ...

  5. dfs版SPFA判负环

    例题 Description 泡泡鱼是一条调皮的鱼,ta的家住在一片珊瑚礁上.在ta的眼里,这些珊瑚礁的形态可以脑补成一个n个节点,m条边的带权图,在海水的腐蚀下,这些珊瑚礁形成了许多的环,ta想考考 ...

  6. 天路(01规划+SPFA判负环)

    传送门 公式图片来自洛谷题解 因为求V之和与P之和的比值的最大值.这个值不超过200 考虑到二分答案,设ans为最大值,则有 可以看出是01分数规划 那么每次就重新分配边的权值: ans*ci-vi ...

  7. POJ 3259 Wormholes SPFA判负环

    思路:SPFA判负环 数组不要开太小-- (后面附一组测试数组) // by SiriusRen #include <queue> #include <cstdio> #inc ...

  8. 算法提高课-图论-负环-AcWing 904. 虫洞:spfa求负环裸题

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 负环:负环是这样的一个环,该环上的边权之和是负数. 存在负环的话,会对我们求最短路造成障碍,因为绕着这个负环转无数次,最短路越来越小 ...

  9. 【POJ-3259】 Wormholes(判负环,spfa算法)

    题干: While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A worm ...

最新文章

  1. 只缺一个程序员 如何让产品实现
  2. 动态半导体ram依据什么存储信息_LPDDR4X和RAM两者有什么关系 它们有什么特点
  3. 关于jquery-Validate
  4. 找出矩阵中绝对值最大的元素及其位置_线性代数之——矩阵范数和条件数
  5. AngularJS的学习笔记(一)
  6. SAP Spartacus里的product carousel控件的实现cx-product-carousel
  7. python 爬虫程序示例,python实现简单爬虫功能的示例
  8. P3605 [USACO17JAN]Promotion Counting P(树状数组)
  9. 贪心 HDOJ 5090 Game with Pearls
  10. [译] Architecture Components 之 Adding Components to your Project
  11. DOTA 2血虐人类的OpenAI,原来靠的是作弊?
  12. C语言练习-绘制金字塔
  13. MOSFET知识小结
  14. 屏幕录像软件Community Clips Recorder简介及其使用技巧(郝宪玮)
  15. 记录项目中遇到的坑(二)
  16. Leetcode #1 Two Sum
  17. 深信服技术认证之使用spark进行数据分析示例之拆分字段
  18. g40-45支持虚拟化技术_CPU支持虚拟化,虚拟化有什么用怎么开启
  19. opencv 去除背景
  20. Web应用程序设计十个建议

热门文章

  1. 在pytorch中expand_dim
  2. Anaconda创建、激活、退出、删除虚拟环境
  3. Django 创建超级用户
  4. Backdooring a OS VM
  5. P1262 间谍网络
  6. 在 Azure 虚拟机上快速搭建 MongoDB 集群
  7. nodejs API(二)
  8. [C/C++]_[0基础]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和差别]
  9. SCOPE 中 SPFILE、MEMORY、BOTH 的小小区别
  10. AC自动机(Aho-Corasick automation)(转)