社区讨论

求助!第一个点能过,其余要么超时,要么过大

P5318【深基18.例3】查找文献参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2x8t9k
此快照首次捕获于
2023/10/23 21:16
2 年前
此快照最后确认于
2023/10/23 21:16
2 年前
查看原帖
样例是能过的,刚开始的时候Max设置成了50,除了第一个点以外全是RE,但是Max=10000的时候内存又过大了,稍微小一点后四个点要么RE,要么超时
C
#include<iostream>
#include<queue>
using namespace std;
const int Max=10000;

struct AMGraph {
	int vexs[Max];//顶点数据数组
	int arr[Max][Max];//邻接矩阵
	int vexnum, arcnum;//顶点数和边数
};

void initGraph(AMGraph& G) {
	cin >> G.vexnum >> G.arcnum;
	for (int i = 1; i <= G.vexnum; i++) {
		G.vexs[i]=i;
	}
	for (int i = 1; i <= G.vexnum; i++)
	{
		for (int j = 1; j <= G.vexnum; j++)
		{
			G.arr[i][j] = Max;		//邻接矩阵的初值都为无穷大
		}
	}
}
int locateVex(AMGraph G, int u) {
	for (int i = 1; i <= G.vexnum; i++) {
		if (u == G.vexs[i]) {
			return i;
		}
	}
	return -1;
}
void createGraph(AMGraph& G) {
	int i = 0, j = 0, w = 0;//i,j代表顶点下标,w代表权值
	int v1 = 0, v2 = 0;//v1,v2为顶点数据
	for (int k = 1; k <= G.arcnum; k++) {
		cin >> v1 >> v2 ;
		i = locateVex(G, v1);//找到v1在顶点表的下标,并返回赋值给i
		j = locateVex(G, v2);//找到v2在顶点表的下标,并返回赋值给j
		G.arr[i][j] = 1;
		//G.arr[j][i] = G.arr[i][j];//无向图的矩阵是对称矩阵		
	}
	//cout << endl;
}
void showGraph(AMGraph G)
{
	for (int i = 1; i <= G.vexnum; i++)
	{
		for (int j = 1; j <= G.vexnum; j++)
		{
			if (G.arr[i][j] == Max)	//无穷大弄得更好看点
				cout << "∞" << " ";
			else
				cout << " " << G.arr[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}
int visit[Max + 1];//辅助数组
void dfs(AMGraph G, int i) {
	cout << G.vexs[i] << " ";//输出0下标在顶点表的值
	visit[i] = 1;//辅助数组对应下标i的值置为1
	for (int j = 1; j <= G.vexnum; j++) {
		if (G.arr[i][j] != Max && visit[j] != 1) {//只要是邻接的顶点并且没有访问过
													//不然就退回,也是递归结束条件
			dfs(G, j);//递归使用函数
		}
	}
}
int visit1[Max + 1];
void bfs(AMGraph G, int i) {
	cout << G.vexs[i]<<" ";
	visit1[i] = 1;
	queue <int>q;//i为矩阵中顶点的行下标,让它入队(顶点表的下标和矩阵的列下标,行下标一致,本算法中说谁的下标都一样)
	q.push(i);
	while (!q.empty()) {
		int u = q.front();
		
		q.pop();
		for (int j =1; j <= G.vexnum;j++) {
			if (G.arr[u][j] != Max && visit1[j] != 1) {
				cout << j<<" ";
				visit1[j] = 1;
				q.push(j);
			}
		}
	}
}
int main() {
	AMGraph G;
	initGraph(G);
	//showGraph(G);
	createGraph(G);
	//showGraph(G);
	dfs(G, 1);
	cout << endl;
	bfs(G, 1);
}

回复

2 条回复,欢迎继续交流。

正在加载回复...