#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=100010,M=N*2;
int n,x,y;
int h[N],e[M],ne[M],idx;
int ans=N;
bool st[N];
//e是当前的数值 ne指向根部的位置(往a指) h指向现在新存储树枝的位置 idx存储要长出来的树丫
void add(int a,int b){
e[idx]=b; //h只是作为一个头,不让树没有方向
ne[idx]=h[idx];
// cout<<"ne="<<ne[idx]<<endl<< h[a]<<" "<< "a="<<a<<endl;
//cout<<"idx="<<idx<<endl;
h[a]=idx++;
// cout << h[a]<<" "<< "a="<<a<<endl<<"idx="<<idx<<endl;
//cout<<"h["<<a<<"]"<<h[a]<<endl;
}
void dfs(int u){
//st[u]=true;
for(int i=h[u];i!=-1;i=ne[i]){
int j=e[i];
// if(st[j]){
// continue; //循环
// }
cout << j <<"树枝"<<endl;
}
}
int main(){
cin>>n;
memset(h,-1,sizeof(h));
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
add(a,b);
// add(b,a);
}
dfs(3);
return 0;
}
邻接表的使用方法(看到一丝生机)
#include <iostream>
#include <vector>
using namespace std;
const int N = 100010;
vector<int> tree[N];
void addEdge(int a, int b) {
tree[a].push_back(b); // 从 a 到 b 的边
tree[b].push_back(a); // 如果是无向图,还需要从 b 到 a 的边
}
void printGraph() {
for (int i = 0; i < 5; i++) {
cout << "顶点 " << i << " 的邻接表:";
for (int j : tree[i]) {
cout << " " << j;
}
cout << endl;
}
}
int main() {
addEdge(0, 1);
addEdge(0, 2);
addEdge(1, 3);
addEdge(2, 3);
addEdge(3, 4);
printGraph();
return 0;
}
类封装的方法 麻烦
#include <iostream>
#include <vector>
using namespace std;
class Graph {
private:
int V; // 图的顶点数
vector<vector<int>> adj; // 邻接表
public:
Graph(int V): V(V) {
adj.resize(V + 1); // 只在构造函数中调整邻接表大小
} // 构造函数,初始化图
void addEdge(int u, int v); // 添加边
void printGraph(); // 打印图的邻接表
};
//Graph::Graph(int V) {
// this->V = V;
// adj.resize(V + 1); // 将邻接表大小调整为 V + 1,用于顶点编号从 1 开始的情况
//}
void Graph::addEdge(int u, int v) {
adj[u].push_back(v); // 添加 u 到 v 的边
adj[v].push_back(u); // 添加 v 到 u 的边(无向图)
}
void Graph::printGraph() {
for (int i = 1; i <= V; ++i) {
cout << "顶点 " << i << " 的邻接表:";
for (int j = 0; j < adj[i].size(); ++j) {
cout << adj[i][j] << " ";
}
cout << endl;
}
}
int main() {
int V = 5; // 图的顶点数
Graph g(V);
g.addEdge(1, 2);
g.addEdge(1, 3);
g.addEdge(2, 3);
g.addEdge(3, 4);
g.addEdge(4, 5);
g.printGraph();
return 0;
}