图!!!

图的遍历和存储课件

无向图

#include<iostream>
#include<cstring>
using namespace std;
int n,m,u,v, tot, head[1001];
bool vis[1001];
struct edge{
int u,v,next;
}g[100001];
void addedge(int u,int v){
  g[++tot].u=u;//新申请空间
  g[tot].v=v;
  g[tot].next=head[u];
  head[u]=tot; //从尾插入

}
void dfs(int u){
  cout<<u<<" ";
  vis[u]=true;
  for(int i=head[u];i!=-1;i=g[i].next){//注意i的取值和边界
    int v=g[i].v;
    if(!vis[v])dfs(v);
  }
} 

无向图判有环

using namespace std;
int n,m,u,v;
bool vis[1001],flag;
vector<int> g[1001];
void dfs(int u,int fa){
    vis[u]=true;
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        if(v==fa) continue;//v为u的父节点,忽略不计
        if(!vis[v]) dfs(v,u);
        else flag=true;//访问到已访问过的点,有环
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]) dfs(i,-1);//-1表示i为根节点
    }
    if(flag) cout<<"have circle";
    else cout<<"have no circle";
}