原题地址
https://pintia.cn/problem-sets/1268384564738605056/problems/1281571555116650496
解题思路
我是用了邻接表的做法~
注意事项
注意题目要求从小到大进行访问,所以在插入边的时候要注意找到合适的位置进行插入!
这里主要就涉及链表操作拉~
判断的时候注意插入成为第一个结点的情况(一种是头结点指针指向NULL,一种是权值比第一个结点数据就小),这时候我用的是头结点的指针,所以拎出来写~
参考代码
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
typedef double db;
typedef long long LL;
typedef vector<int> VI;
const int inf = 2e9;
const LL INF = 8e18;
const int maxn = 15;
bool vis[maxn];
typedef struct edge{
int v1, v2;
};
//邻接表上的结点
typedef struct vnode{
int v;
vnode* next;
};
//头结点
typedef struct hnode{
int data; //存头结点的数据
vnode* next;
}vlist[maxn];
typedef struct gnode{
int nv, ne;
vlist g;
};
//初始化
gnode* create(int n) {
gnode* graph = (gnode*)malloc(sizeof(struct gnode));
graph->ne = 0;
graph->nv = n;
//初始化邻接表表头指针
for (int i = 0; i < n; ++i) {
graph->g[i].next = NULL;
}
return graph;
}
void insert(gnode* g, edge e) {
vnode* node = (vnode*)malloc(sizeof(struct vnode));
node->v = e.v2;
vnode* pos = g->g[e.v1].next, *pre = pos;
if (!pos || pos->v > node->v) { //若头结点为空或权值小于第一个值
node->next = pos;
g->g[e.v1].next = node;
} else {
//遍历链表,找到合适位置插入
for (pre, pos = pre; pos; pre = pos, pos = pos->next) {
//cout << pos->v << ' ' << node->v << endl;
if (pos->v > node->v)
break;
}
node->next = pos;
pre->next = node;
}
//无向图,反向还要来一次
node = (vnode*)malloc(sizeof(struct vnode));
node->v = e.v1;
pos = g->g[e.v2].next, pre = pos;
if (!pos || pos->v > node->v) {
node->next = pos;
g->g[e.v2].next = node;
} else {
for (pre, pos; pos; pre = pos, pos = pos->next) {
if (pos->v > node->v)
break;
}
node->next = pos;
pre->next = node;
}
}
void dfs(gnode* g, int v) {
vnode* av;
vis[v] = true;
printf("%d ", v);
//指针
for (av = g->g[v].next; av; av = av->next) {
if (!vis[av->v]) dfs(g, av->v);
}
}
void bfs(gnode* g, int v) {
queue<int> q;
q.push(v);
vis[v] = true;
int now;
vnode* av;
while (!q.empty()) {
now = q.front();
q.pop();
printf("%d ", now);
for (av = g->g[now].next; av; av = av->next) {
now = av->v;
if (!vis[now]) {
q.push(now);
vis[now] = true;
}
}
}
}
int main() {
int nv, ne;
edge e;
scanf("%d%d", &nv, &ne);
gnode* graph = create(nv);
for (int i = 0; i < ne; ++i) {
scanf("%d%d", &e.v1, &e.v2);
insert(graph, e);
}
//dfs
for (int i = 0; i < nv; ++i) {
if (!vis[i]) {
printf("{ ");
dfs(graph, i);
printf("}\n");
}
}
fill(vis, vis + nv, 0);
for (int i = 0; i < nv; ++i) {
if (!vis[i]) {
printf("{ ");
bfs(graph, i);
printf("}\n");
}
}
return 0;
}