IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> hdu4460题解与思考(没解出来别看) -> 正文阅读

[数据结构与算法]hdu4460题解与思考(没解出来别看)

hdu4460 题解与思考 Friend Chains

  1. 题意:
    简单来说就是自己任意输入一个图的结点和边,找到一个最小路径长度k,任意两点的连通路径长度都小于等于,如果有孤立点,则输出-1

  2. 思路:
    首先能够想到用bfs做遍历,由于起点不固定,所以需要for循环对每个点做遍历,比较可以得到k。至于图的构建,可以考虑用邻接矩阵,这样vis也可以用二维数组。本题有一个问题,输入的名字并不直接对应数字,这就给我们在邻接矩阵上直接处理边的关系带来了麻烦,解决方案是使用map库,map的好处是可以直接通过关键字访问对应的id,且复杂度较低(O(log2n))。注意如果图中有孤立点,就没有点能与之联系,视为距离无限,输出-1。
    结合上面的思路可以较快的得到下面的代码:

#include<iostream>
#include<queue>
#include<string>
#include<map>
using namespace std;

struct node {
	int num;
	int step;
};
int edge[1000][1000] = {0};//用来记录边的连接情况
bool vis[1000][1000];
int n;

int path_k(int e) {
	int k=0;
	node head;
	head.num = e;
	head.step = 0;
	queue<node> q;
	q.push(head);
	while (!q.empty()) {
		node front=q.front();
		node next;
		int flag = 0;
		for (int i = 0; i < n; i++) {
			if (edge[front.num][i] != 0&&edge[i][front.num]!=0) {
				flag = 1;
				if (!vis[front.num][i]) {
					next.num = i;
					next.step = front.step + 1;
					if (next.step > k) k = next.step;
					q.push(next);
					vis[front.num][i] = true;
					vis[i][front.num] = true;
				}
			}
		}
		if (flag == 0) return -1;
		q.pop();
	}
	return k;
}

int main() {
	while (scanf("%d",&n) && n != 0) {
		map<string, int> peop;
		string s;
		for (int i = 0; i < n; i++) {
			cin >> s;
			//scanf("%s", s.c_str());
			peop[s] += i;
		}
		int m;
		cin >> m;
		for (int i = 0; i < m; i++) {
			string s1, s2;
			cin >> s1 >> s2;
			//scanf("%s %s", s1.c_str(),s2.c_str());
			edge[peop[s1]][peop[s2]] = 1;
			edge[peop[s2]][peop[s1]] = 1;
		}
		int k=0;
		for (int i = 0; i < n; i++) {
			memset(vis, false, sizeof(vis));
			int temp = path_k(i);
			if (temp == -1) {
				k = -1;
				break;
			}
			else if (temp > k) {
				k = temp;
			}
		}
		//cout << k << endl;
		printf("%d\n", k);
	}
	return 0;
}

但是这段代码在oj上会报出TimeLimitedExceed的错误,说明采用的方法有待改进,手写队列并稍作优化后,仍然会有TLE的错误…
大佬救我
代码奉上

#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<map>
using namespace std;

struct node {
	int num;
	int step;
};
int edge[1000][1000] = {0};//用来记录边的连接情况
bool vis[1000];
int n;

int path_k(int e) {
	node q[1000];
	int k=0;
	node head;
	head.num = e;
	head.step = 0;
	//queue<node> q;
	int top=0, tail=0;
	//q.push(head);
	q[tail++] = head;
	vis[e] = true;
	while (top!=tail) {
		node front=q[top++];
		node next;
		int flag = 0;
		for (int i = 0; i < n; i++) {
				if (edge[front.num][i] != 0 && edge[i][front.num] != 0) {
					flag = 1;
					if (!vis[i]) {
						next.num = i;
						next.step = front.step + 1;
						if(next.step>6) return -1;
						if (next.step > k) k = next.step;
						q[tail++] = next;
						vis[i] = true;
					}
				}
		}
		if (flag == 0) return -1;
	}
	return k;
}

int main() {
	while (scanf("%d",&n) && n) {
		memset(edge, 0, sizeof(edge));
		map<string, int> peop;
		string s;
		for (int i = 0; i < n; i++) {
			cin >> s;
			//scanf("%s", s);
			peop[s] += i;
		}
		int m;
		scanf("%d", &m);
		for (int i = 0; i < m; i++) {
			string s1, s2;
			cin >> s1 >> s2;
			//scanf("%s %s", s1.c_str(),s2.c_str());
			edge[peop[s1]][peop[s2]] = 1;
			edge[peop[s2]][peop[s1]] = 1;
		}
		int k=0;
		for (int i = 0; i < n; i++) {
			memset(vis, false, sizeof(vis));
			int temp = path_k(i);
			if (temp == -1) {
				k = -1;
			}
			else if (temp > k&&k!=-1) {
				k = temp;
			}
		}
		//cout << k << endl;
		printf("%d\n", k);
	}
	return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:27:44  更:2021-08-25 12:29:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:34:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码