树与图



树和图的存储
#include <iostream> #include <cstring> using namespace std; const int N=1e5+10,M=2*N; int h[N],e[M],ne[M],idx;//此e,ne同单链表,之前有1个单链表所以head,这里n个单链表,所以n个头h[] int n; bool st[N]; int ans=N; void add(int a,int b)//插入一条a指向b的边 { //插入一条边:即在a所在链表插入节点b e[idx] = b, ne[idx] = h[a], h[a] = idx ++; }
int main() { cin>>n; memset(h,-1,sizeof h); //邻接表初始化all头=-1即可 //之前链表头节点指向-1,这里n个单链表都指向-1即可 for(int i=0;i<n;++i) { int a,b;cin>>a>>b; add(a,b),add(b,a); } dfs(1); cout<<ans<<endl; return 0; }
存邻接表可以用vector来存,但效率不如数组模拟


关于DFS和BFS一般每个点只遍历一次,可开个bool记录是否走过
树和图的深搜
#include <iostream> #include <cstring> using namespace std; const int N=1e5+10,M=2*N; int h[N],e[M],ne[M],idx; int n; bool st[N]; int ans=N; void add(int a,int b)//插入一条a指向b的边 { //插入一条边:即在a所在链表插入节点b e[idx] = b, ne[idx] = h[a], h[a] = idx ++; } int dfs(int u)//u表示当前dfs到点 { st[u]=true;//标记当前点搜过 //遍历u的all出边 for(int i=h[u];i!=-1;i=ne[i])//同遍历单链表 { int j=e[i];//当前节点在图中编号 if(!st[j]) dfs(j);//j未被搜,则搜 } }
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(1);//选任意点开始搜索 cout<<ans<<endl; return 0; }

浙公网安备 33010602011771号