社区讨论
求助!第一个点能过,其余要么超时,要么过大
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 条回复,欢迎继续交流。
正在加载回复...