bfs..cow

想到博客有人在看就开始紧张了......


这个题...饿,后面又飞速打了一份,竟然还过了,但是还是要有注意的东西
过了!(感激涕零)

bfs也就是每个都跑一遍,跑到p队列

p有三个情况,后面压进去,前面把每个p分析出来跑

一直到所有的都带上访问标记为止...

#include<iostream>
#include<queue>
using namespace std;
//奶牛的题...我可真tm强大啊  加油
//周末还是得玩玩儿啊(笑cey
int vis[100005] = { 0 };
int record[100005] = { 0 };


//x+1  x-1  2*x
int main()
{
	int n, m; while (cin >> n >> m)
	{
		if (n < m) {
			queue<int>q;
			q.push(n);//用于初始化,把第一个压入了..
			vis[n] = 1;//**************
			record[n] = 0;
			//*******初始化问题,初始化问题,初始化问题,这样子跑的起来哦???
			//(好喜欢新电脑啊  !!!我自己首先写出来的时候是不对的啊
			//int k = n;
			while (!q.empty()) {
				int k = q.front();
				q.pop();
				int head = k;
				//这个k的值被改来改去的吧......老问题了哈哈哈
				for (int i = 0; i < 3; i++)
				{
					k = head;//????初始化问题???
					if (i == 0)
						k = k - 1;
					else if (i == 1)
						k = k + 1;
					else k = 2 * k;

					if (k < 0 || k>100005)continue;
					//****这里是||啊..runtime  error....
					//*****这里不是m啊....要是能达到,要有n-1的话
					//这里要是越界....要是越界.... m的话你太狭窄了1太狭窄了

					if (vis[k] == 1)continue;

					vis[k] = 1;//标记;
					q.push(k);//把k压入以便进行下面的运算= -
					record[k] = record[head] + 1;


					if (k == m)
					{
						cout << record[k];
						return 0;//	break;
					}

				}

			}//n m 
		}
		else cout << n-m;
	}
		

	return 0;
}

注意的东西

1.n和m还是没给哪个大哪个小= -

这个坑真的是= -少写了那么一个号

2.runtime error.....while (!q.empty()) {
int k = q.front();
q.pop();

int head = k;

for (int i = 0; i < 3; i++)

这个....因为有3个嘛,然后k-1 k+1  k*2 

这个k的值要被改变的啊!!!!!

然后Int head=k;

3.if (k < 0 || k>100005)continue;

这个是||啊啊啊

还有就是k这里是越界的

不是m而已


4.

queue<int>q;
q.push(n);//用于初始化,把第一个压入了..
vis[n] = 1;//**************

record[n] = 0;


这里记得初始化

**初始化,初始化记得,把n的vist改成1

因为这个是最近的...不然会出问题吧= -

5.范围记得...

100005


***另外....... 用set的时候如何实现访问?

周六那个天梯赛里面用到,,,count当然效率很低

http://blog.csdn.net/castledrv/article/details/46897575

对于set而言.. insert是一样的 然后你要这么访问 用迭代器啊迭代器

  1. set<int>::iterator iter;  

set<int>::iterator it;

set<int>::iterator it;

  1. iter = num.begin();  
  2.         cout<<*iter;  
  3.         iter++;  
  4.         for (; iter != num.end();  iter++)  
  5.             cout<<" "<<*iter;  
  6.         cout<<endl;  
  7.         num.clear();  

迭代器多好用啊你看 = =

iter=num.begin();

cout<<*iter<<endl;iter++;

for(;iter!num.end();iter++)

cout<<" "<<endl;


num.clear(大概set要清空吧..


周六那个还有个很暴力的x*x+ y*y+z*z

输入的不大于10000那只要循环是100就可以了

或者直接k*k<10000?(记不清了..开黑开个屁啊)


最开始的想法是3*x*x 10000 其实这样的话x最大的是60

似乎是那个三角形定理不行我脑子根本写不下去啊以后在外面打完回来写题解好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一个基于C++的BFS求最短路径的示例代码: ```cpp #include <iostream> #include <queue> #include <cstring> using namespace std; const int MAXN = 1005; // 最大节点数 const int INF = 0x3f3f3f3f; // 无穷大 int n, m; // n表示节点个数,m表示边数 int dis[MAXN]; // 存储起点到每个节点的距离 bool vis[MAXN]; // 记录每个节点是否被访问过 int head[MAXN], to[MAXN<<1], nxt[MAXN<<1], edge[MAXN<<1], cnt; // 邻接表存图 void addEdge(int u, int v, int w) { to[++cnt] = v; nxt[cnt] = head[u]; edge[cnt] = w; head[u] = cnt; } void bfs(int start) { memset(dis, INF, sizeof(dis)); // 初始化距离为无穷大 memset(vis, false, sizeof(vis)); // 初始化所有节点都未被访问过 dis[start] = 0; // 起点到自己的距离为0 vis[start] = true; // 起点已经访问过了 queue<int> q; // 定义一个队列,用于广度优先搜索 q.push(start); // 将起点加入队列 while (!q.empty()) { int u = q.front(); q.pop(); // 取出队首节点 for (int i = head[u]; i; i = nxt[i]) { int v = to[i], w = edge[i]; if (!vis[v]) { // 如果这个节点未被访问过 dis[v] = dis[u] + w; // 更新距离 vis[v] = true; // 标记为已访问 q.push(v); // 将其加入队列 } } } } int main() { cin >> n >> m; for (int i = 1; i <= m; ++i) { int u, v, w; cin >> u >> v >> w; addEdge(u, v, w); addEdge(v, u, w); // 无向图需要加两条边 } int start; cin >> start; bfs(start); for (int i = 1; i <= n; ++i) { if (dis[i] != INF) { cout << start << " 到 " << i << " 的最短距离为:" << dis[i] << endl; } } return 0; } ``` 这段代码使用邻接表存图,时间复杂度为O(n+m),其中n表示节点数,m表示边数。在实际使用中,可以根据自己的需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值