同上题,不过改的spfa算法,注意每个节点进入队列的次数至多为n-1次(一共n个节点),若进入大于等于n次了,则说明图中存在负权回路,此时正好满足题目中时光倒流的要求,另外注意,vector每次用的时候清空。
下面是spfa算法的简单说明:
我们用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是松弛:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
注意对刚出队列的节点的所有相邻节点都要做松弛操作,不管该节点是否在队列中,不在队列中的松弛点加入到队列即可。
下面是spfa算法的简单说明:
我们用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是松弛:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
注意对刚出队列的节点的所有相邻节点都要做松弛操作,不管该节点是否在队列中,不在队列中的松弛点加入到队列即可。
#include <iostream> #include <fstream> #include <vector> #include <queue> #define INF 999999999 using namespace std; struct E { int v; int w; }edges[6000]; vector<E> v[1008]; bool visited[1008]; int dist[1008]; int enterCount[1008]; int n,m,w,edgeCount; void addEdge(int e,int s,int t) { edgeCount++; edges[edgeCount].v=s; edges[edgeCount].w=t; v[e].push_back(edges[edgeCount]); } bool spfa() { int i; queue<int> q; visited[1]=1; dist[1]=0; enterCount[1]=1; for(i=2;i<=n;i++) { visited[i]=0; dist[i]=INF; enterCount[i]=0; } q.push(1); while(!q.empty()) { int temp=q.front(); q.pop(); visited[temp]=0; for(i=0;i<v[temp].size();i++) { if(dist[v[temp][i].v]>dist[temp]+v[temp][i].w) { dist[v[temp][i].v]=dist[temp]+v[temp][i].w; if(!visited[v[temp][i].v]) { visited[v[temp][i].v]=1; enterCount[v[temp][i].v]++; if(enterCount[v[temp][i].v]>=n) return true; q.push(v[temp][i].v); } } } } return false; } int main() { //ifstream cin("1.txt"); int f,i; cin>>f; while(f--) { cin>>n>>m>>w; edgeCount=0; for(i=1;i<=n;i++) v[i].clear(); for(i=0;i<m;i++) { int s,e,t; cin>>s>>e>>t; addEdge(s,e,t); addEdge(e,s,t); } for(i=0;i<w;i++) { int s,e,t; cin>>s>>e>>t; addEdge(s,e,-t); } if(spfa()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
发表评论
-
2011清华考研机试题2
2011-08-09 14:56 936http://ac.jobdu.com/problem.php ... -
2011清华考研机试题1
2011-08-09 14:40 675题目描述 http://ac.jobdu.com/proble ... -
考研清华2011复试机考第三题
2011-08-09 13:51 1534题目描述 在某条线路上有N个火车站,有三种距离的路程,L1, ... -
poj3259 bellman水题
2011-08-08 17:04 996poj3259http://poj.org/problem?i ... -
acm题目常用的预处理
2011-08-08 15:26 1202#include<iostream> #in ... -
poj1860
2011-08-08 14:06 740poj1860http://poj.org/problem?i ... -
water~9
2011-08-06 18:01 461poj2109http://poj.org/problem?i ... -
water~8
2011-08-06 17:22 649poj2027http://poj.org/problem?i ... -
water~7
2011-08-06 17:15 601poj1328http://poj.org/problem?i ... -
water~6
2011-08-06 14:27 758poj1088http://poj.org/problem?i ... -
water~5
2011-08-06 14:24 663poj1003http://poj.org/problem?i ... -
water~4
2011-08-06 14:09 705poj1004http://poj.org/problem?i ... -
water~3
2011-08-06 13:59 565poj2159http://poj.org/problem?i ... -
water~2
2011-08-06 12:10 565poj3299http://poj.org/problem?i ... -
water~1
2011-08-06 10:35 671poj1503http://poj.org/problem?i ... -
POJ3280 简单DP
2011-08-05 14:48 925poj3280:http://poj.org/problem? ... -
POJ3253
2011-08-04 13:36 810poj3253:http://poj.org/problem? ...
相关推荐
【标题】"POJ3259-Wormholes【Bellman】"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要涉及图论中的一个算法——贝尔曼-福特(Bellman-Ford)算法。 【描述】"北大POJ...
【标题】"POJ1013 C解法"是一个关于解决特定编程竞赛问题的教程,主要关注如何用C语言来实现解决方案。POJ(Problem Solving in Java)是著名的在线编程竞赛平台,它提供了各种算法题目供参赛者挑战,而POJ1013是一...
标题中的“POJ3259--Wormholes(bellman)”是指一个编程竞赛问题,源自POJ(Programming Online Judge)平台。这个问题涉及到利用贝尔曼-福特算法(Bellman-Ford Algorithm)解决“虫洞”(Wormholes)的问题。在...
【标题】"北大POJ初级-所有题目AC代码+解题报告" 涉及的知识点主要集中在编程、算法和在线判题系统方面。北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者...
《田忌赛马:POJ 2287 贪心解法解析》 在计算机科学领域,算法是解决问题的核心。"田忌赛马"这个题目来源于古代中国的一个著名故事,而在这个故事的基础上,被引入到了编程竞赛的场景中。POJ(Programming Online ...
《C++经典代码大全》是一份集合了作者自编的C++编程实例,主要涵盖了POJ(Problem Set of Peking University)在线判题系统上的众多经典编程题目。这份资源对于初学者来说尤其宝贵,因为它提供了丰富的实践案例,...
* 最短路径算法:例如 Dijkstra、Bellman-Ford、Floyd、Heap+Dijkstra,例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、...
POJ 1012 约瑟夫问题的数学解法及分析POJ 1012 约瑟夫问题的数学解法及分析POJ 1012 约瑟夫问题的数学解法及分析
《北京大学POJ3096:令人惊奇的字符串——解题报告与代码解析》 北京大学的在线编程平台POJ上有一道题目名为“Surprising Strings”(POJ 3096),这是一道考察算法思维和编程能力的题目。在本篇解题报告中,我们将...
* 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...
- 图的深度优先遍历和广度优先遍历:用于探索图的所有节点,如`poj1860, poj3259`。 - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:...
北京大学的POJ题目解题代码集合是一份宝贵的资源,它涵盖了ACM(国际大学生程序设计竞赛)中的许多问题,旨在帮助学生和编程爱好者提升算法理解与编程技能。POJ(Problem Set for Online Judges)是中国最早的在线...
- **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...
在实际应用中,例如POJ 1201 "Intervals" 这样的问题,SPFA可以用来解决差分约束系统。差分约束系统是一类线性不等式约束问题,可以通过构造有向图并利用SPFA求解最短路径来找出满足条件的整数序列。在这个问题中,...
包括深度优先遍历(DFS)和广度优先遍历(BFS),用于探索图的所有节点,是解决许多图问题的基础,如poj1860和poj3259所示。 #### 最短路径算法 Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有...
例如,题目poj1860和poj3259就是典型的最短路径问题。 ### 3. 数据结构 数据结构部分包括数组、链表、栈、队列、树、堆、哈希表等,它们在存储和访问数据时提供不同的效率和特性。哈希表(Hash)是一种高效的数据...
【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...
- (poj1860, poj3259, poj1062, poj2253, poj1125, poj2240):介绍迪杰斯特拉算法(Dijkstra)、贝尔曼-福特算法(Bellman-Ford)、弗洛伊德算法(Floyd)等。 - 使用堆优化的迪杰斯特拉算法。 3. **最小生成树...
【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...