`
dailygoing
  • 浏览: 4500 次
社区版块
存档分类
最新评论

uva 1599双向bfs

 
阅读更多
//0.140s
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 100005;
const int inf = 1 << 30;
int i, a, b, c, n, m;
bool vis[maxn];

struct node {
	int v; int c;
	node* next;
}G[maxn * 4];
node *adj[maxn], *cur, *p;
int path[maxn], d[maxn], w[maxn], bs;

void rev_bfs() {
	memset(d, 0, (n + 1) * sizeof(int));
	d[n] = 1; 
	queue<int> q;
	q.push(n);
	while (!q.empty()) {
		a = q.front();  q.pop();
		if (d[1] && d[a] >= d[1]) {
			continue;//剪枝1
		}
		for (p = adj[a]; p; p = p->next) {
			b = p->v;
			if (!d[b])
			{
				d[b] = d[a] + 1;
				q.push(b);
			}
		}
	}
}


void bfs() {
	memset(vis,0, sizeof(vis));
	vis[1] = true;
	vector<int> q1;
	q1.push_back(1);
	m = d[1]-1;
	while(m){
		bs = inf;
		for (i = 0; i < q1.size(); i++) {
			a = q1[i];
			for (p = adj[a]; p; p = p->next) {
				b = p->v; c = p->c;
				if (d[b] == m && c < bs)
					bs = c;
			}
		}
		vector<int> q2;
		for (i = 0; i < q1.size(); i++) {
			a = q1[i];
			for (p = adj[a]; p; p = p->next) {
				b = p->v;
				if (p->c == bs && d[b] == m && !vis[b])
				{
					vis[b] = true;//剪枝2
					q2.push_back(b); //cout<<a<<'-'<<bs<<'-' << p->v << endl;
				}
			}
		}
		w[m--] = bs;
		q1 = q2;
	}
	printf("%d\n", d[1]-1);
	printf("%d", w[d[1]-1]);
	for (i =d[1]-2; i >0; i--) {
		printf(" %d", w[i]);
	}
	printf("\n");
}


int main()
{
	while (scanf("%d%d", &n, &m) == 2) {
		memset(adj, 0, sizeof(adj));
		cur = G;
		for (i = 0; i < m; i++) {
			scanf("%d%d%d", &a, &b, &c);
			cur->v = b; cur->c = c; cur->next = adj[a];//从前面插入
			adj[a] = cur++;
			cur->v = a; cur->c = c; cur->next = adj[b];
			adj[b] = cur++;
		}
		rev_bfs();
		bfs();
	}
	return 0;
}

/*
4 6
1 2 1
1 3 2
3 4 3
2 3 1
2 4 4
3 1 1
*/

 

分享到:
评论

相关推荐

    魔方-BFS-输入_魔方bfs_魔方降群法+双向bfs_魔方降群_

    在IT领域,尤其是在算法和计算机科学中,"魔方-BFS-输入_魔方bfs_魔方降群法+双向bfs_魔方降群_"这个标题涉及到的是使用广度优先搜索(Breadth First Search, BFS)解决魔方问题的高级技巧。魔方是一种三维旋转拼图...

    双向BFS算法实现公交车行程问题

    通过双向的BFS算法,使得公交安排这样一个问题在最大程度上减少了时间复杂度。而且对于换乘次数的限制一直是一个瓶颈,会严重增加时间复杂度,但本程序通过matlab巧妙的设计,使得换乘10次以内都可以理想时间内解答...

    UI_missionaries_project:使用DFS,BFS和双向BFS实施传教士和食人族的问题和解决方案

    "UI_missionaries_project"项目就是这样一个例子,它运用了三种经典的图遍历算法——深度优先搜索(DFS)、广度优先搜索(BFS)以及双向广度优先搜索(Bidirectional BFS),来解决著名的“传教士与食人族”问题。...

    DoWalle#algo#752-[双向bfs]-打开转盘锁1

    题目:752. 打开转盘锁执行用时:204 ms, 在所有 C++ 提交中击败了40.14%的用户内存消耗:40.3 MB, 在所有 C++ 提交中击败了25.

    八数码BFS,DFS,BBFS,Astar实现

    该问题常用于演示搜索算法,如宽度优先搜索(BFS)、深度优先搜索(DFS)、双向宽度优先搜索(BBFS)以及A*搜索。 首先,**宽度优先搜索(BFS)**是一种按层进行搜索的算法,它会优先检查离起点近的解。在八数码...

    BFS.rar_bfs_bfs matlab_bfs matlab

    标题中的"BFS.rar_bfs_bfs matlab_bfs matlab"提到了"BFS"以及与MATLAB相关的优化算法。BFS,全称为Breadth-First Search(广度优先搜索),通常用于图论或树结构的遍历。在MATLAB环境中,BFS可以被应用于解决各种...

    广度优先检索 BFS.zip

    **广度优先搜索(BFS)**是一种在图或树数据结构中进行遍历或搜索的算法,其基本思想是从根节点开始,按照层次顺序依次访问每个节点。它首先访问最近的节点,然后逐渐扩展到更远的节点。在有向图中,BFS依然按照层次...

    代码 基于BFS广度优先搜索算法代码

    代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 ...

    simulink BFSK仿真

    标题"simulink BFSK仿真"表明我们要探讨的是使用Simulink进行二进制频移键控(Binary Frequency Shift Keying, BFSK)的模拟与仿真。BFSK是一种数字调制技术,通过改变载波频率来传输二进制数据(0或1)。在Simulink...

    动态内存+BFS

    - `&lt;list&gt;` 提供了双向链表容器的支持。 - `&lt;queue&gt;` 提供了队列容器的支持。 - `&lt;algorithm&gt;` 包含了一些常用的算法函数,如排序等,但本程序并未使用到这些功能。 ##### 2. 命名空间使用 ```cpp using namespace...

    bfsk程序代码matlab

    标题“bfsk程序代码matlab”指的是使用MATLAB语言实现的BFSK(Binary Frequency Shift Keying,二进制频率移键控)编码技术的程序代码。BFSK是一种数字调制方法,通过改变载波频率来传输二进制数据,其中“0”和“1...

    DFS \BFS生成树

    根据给定文件中的标题“DFS \BFS生成树”、描述以及部分代码内容,我们可以提炼出以下几个关键知识点:邻接表、深度优先搜索(Depth-First Search, DFS)、广度优先搜索(Breadth-First Search, BFS)以及如何利用这...

    基于BFS的贪吃蛇

    在本文中,我们将深入探讨如何使用宽度优先搜索(BFS)算法实现经典的“贪吃蛇”游戏。贪吃蛇是一款非常流行的电子游戏,玩家需要控制一个不断移动的蛇去吃食物,每次吃到食物,蛇的长度就会增加,游戏区域也会相应...

    bfs.rar_Bfs算法_bfs

    宽度优先搜索(BFS,Breadth-First Search)是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着树的宽度方向进行探索,直到找到目标节点或者遍历完整个树。在图中,BFS通常用于找出两个节点间的最短路径,或者...

    bfs.rar_BFS+c++_bfs

    **标题中的“bfs.rar_BFS+c++_bfs”表明这是一个关于C++实现BFS算法的压缩包文件,可能包含了一个名为“bfs”的源代码文件。** **描述中的“this is code for bfs in c++”进一步确认了这个压缩包内代码的主要功能...

    bfs.tar.gz_C#BFS_bfs

    【标题】"bfs.tar.gz_C#BFS_bfs" 提供的是一个使用C#实现的广度优先搜索(BFS)算法的代码压缩包。这个压缩包中的内容主要是关于如何在并行计算环境中,利用CUDA(Compute Unified Device Architecture)技术来优化...

    bfs.tcl.tar.gz_BFS algorithm_bfs_bfs matlab_bfs matlab

    **广度优先搜索(BFS)算法** 广度优先搜索(BFS)是一种在图或树数据结构中进行遍历的算法,它按照从根节点开始,先访问所有相邻节点,然后依次对每个已访问节点的相邻节点进行访问的原则进行搜索。在 BFS 中,...

    bfsk_m.rar_BFSK_BFSK matlab_BFSK matlab_fsk_matlab BFSK

    标题中的“bfsk_m.rar_BFSK_BFSK matlab_BFSK matlab_fsk_matlab BFSK”表明这是一个关于BFSK(Binary Frequency Shift Keying,二进制频率移键调制)的仿真项目,使用MATLAB语言进行实现。BFSK是一种数字调制技术,...

    BFS 广度优先搜索算法 matlab

    **广度优先搜索(Breadth-First Search, BFS)**是一种在图或树中搜索节点的算法,它按照从根节点开始,逐层扩展的方式进行。在MATLAB中实现BFS,可以帮助我们解决许多问题,例如查找最短路径、判断图的连通性等。 ...

    BFS.rar_BFS JAVA_Bfs算法_bfs java_java b

    **标题:“BFS.rar_BFS JAVA_Bfs算法_bfs java_java b”** **描述:“java 数据结构 实现图的广度优先算法”** 在计算机科学中,数据结构和算法是编程的基础,它们决定了程序的效率和性能。在这个压缩包中,重点是...

Global site tag (gtag.js) - Google Analytics