`
Midnight0101
  • 浏览: 16772 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

poj3259 spfa解法

poj 
阅读更多
同上题,不过改的spfa算法,注意每个节点进入队列的次数至多为n-1次(一共n个节点),若进入大于等于n次了,则说明图中存在负权回路,此时正好满足题目中时光倒流的要求,另外注意,vector每次用的时候清空。
下面是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;
}

分享到:
评论

相关推荐

    POJ3259-Wormholes【Bellman】

    【标题】"POJ3259-Wormholes【Bellman】"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要涉及图论中的一个算法——贝尔曼-福特(Bellman-Ford)算法。 【描述】"北大POJ...

    POJ1013 C解法

    【标题】"POJ1013 C解法"是一个关于解决特定编程竞赛问题的教程,主要关注如何用C语言来实现解决方案。POJ(Problem Solving in Java)是著名的在线编程竞赛平台,它提供了各种算法题目供参赛者挑战,而POJ1013是一...

    POJ3259--Wormholes(bellman).rar_wormhole code _wormholes

    标题中的“POJ3259--Wormholes(bellman)”是指一个编程竞赛问题,源自POJ(Programming Online Judge)平台。这个问题涉及到利用贝尔曼-福特算法(Bellman-Ford Algorithm)解决“虫洞”(Wormholes)的问题。在...

    北大POJ初级-所有题目AC代码+解题报告

    【标题】"北大POJ初级-所有题目AC代码+解题报告" 涉及的知识点主要集中在编程、算法和在线判题系统方面。北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者...

    田忌赛马: POJ 2287(贪心解法)

    《田忌赛马:POJ 2287 贪心解法解析》 在计算机科学领域,算法是解决问题的核心。"田忌赛马"这个题目来源于古代中国的一个著名故事,而在这个故事的基础上,被引入到了编程竞赛的场景中。POJ(Programming Online ...

    C++经典代码大全,自编,很多poj上的经典题目

    《C++经典代码大全》是一份集合了作者自编的C++编程实例,主要涵盖了POJ(Problem Set of Peking University)在线判题系统上的众多经典编程题目。这份资源对于初学者来说尤其宝贵,因为它提供了丰富的实践案例,...

    poj题目分类

    * 最短路径算法:例如 Dijkstra、Bellman-Ford、Floyd、Heap+Dijkstra,例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、...

    POJ 1012 约瑟夫问题的数学解法及分析

    POJ 1012 约瑟夫问题的数学解法及分析POJ 1012 约瑟夫问题的数学解法及分析POJ 1012 约瑟夫问题的数学解法及分析

    POJ3096-Surprising Strings

    《北京大学POJ3096:令人惊奇的字符串——解题报告与代码解析》 北京大学的在线编程平台POJ上有一道题目名为“Surprising Strings”(POJ 3096),这是一道考察算法思维和编程能力的题目。在本篇解题报告中,我们将...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    poj训练计划.doc

    - 图的深度优先遍历和广度优先遍历:用于探索图的所有节点,如`poj1860, poj3259`。 - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:...

    北京大学poj题目解题代码

    北京大学的POJ题目解题代码集合是一份宝贵的资源,它涵盖了ACM(国际大学生程序设计竞赛)中的许多问题,旨在帮助学生和编程爱好者提升算法理解与编程技能。POJ(Problem Set for Online Judges)是中国最早的在线...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    SPFA算法.doc

    在实际应用中,例如POJ 1201 "Intervals" 这样的问题,SPFA可以用来解决差分约束系统。差分约束系统是一类线性不等式约束问题,可以通过构造有向图并利用SPFA求解最短路径来找出满足条件的整数序列。在这个问题中,...

    poj各种分类

    包括深度优先遍历(DFS)和广度优先遍历(BFS),用于探索图的所有节点,是解决许多图问题的基础,如poj1860和poj3259所示。 #### 最短路径算法 Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有...

    POJ 分类题目 txt文件

    例如,题目poj1860和poj3259就是典型的最短路径问题。 ### 3. 数据结构 数据结构部分包括数组、链表、栈、队列、树、堆、哈希表等,它们在存储和访问数据时提供不同的效率和特性。哈希表(Hash)是一种高效的数据...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    acm训练计划(poj的题)

    - (poj1860, poj3259, poj1062, poj2253, poj1125, poj2240):介绍迪杰斯特拉算法(Dijkstra)、贝尔曼-福特算法(Bellman-Ford)、弗洛伊德算法(Floyd)等。 - 使用堆优化的迪杰斯特拉算法。 3. **最小生成树...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

Global site tag (gtag.js) - Google Analytics