图 遍历

图的遍历一般用两种遍历方法:
1>邻接矩阵遍历(我认为是暴力遍历,要列举每两个点之间是否有边)
2>邻接表遍历(运用了链表的思想,只要有边就存)
显然,后者相比前者更节省空间,但脑回路也要更复杂点

邻接链表遍历

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
    int v,w,next;
}a[2005];
bool f[105];
int first[105];  //first[i]表示以i作为起点的第一条边所在的位置
int n,m,u1,v1,w1,k=0;
queue<int> q;
void add(int u1,int v1,int w1){
        ++k;
        a[k].v=v1;a[k].w=w1;a[k].next=first[u1];first[u1]=k; 
}
void dfs(int x){  //从x点开始深搜
    printf("%d ",x);
    for(int i=first[x];i;i=a[i].next){
        int j=a[i].v;
        if(f[j]){
            f[j]=0;
            dfs(j);
        }
    } 
}
void bfs(){   //从x点开始广搜 
    int x=q.front(); q.pop();
    printf("%d ",x);
    for(int i=first[x];i;i=a[i].next){
        int j=a[i].v;
        if(f[j]){
            f[j]=0;
            q.push(j);
        }
    }
    while(!q.empty())
        bfs();    
}
int main(){
    scanf("%d%d",&n,&m);
    memset(first,0,sizeof(first));
    memset(f,1,sizeof(f));
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&u1,&v1,&w1);
        add(u1,v1,w1);
        add(v1,u1,w1);
    }
    //f[1]=0;    dfs(1);
    f[1]=0;q.push(1);
    bfs();
    return 0;

}

邻接矩阵遍历

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
    int v,w,next;
}a[2005];
bool f[105];
int first[105];  //first[i]表示以i作为起点的第一条边所在的位置
int n,m,u1,v1,w1,k=0;
queue<int> q;
void add(int u1,int v1,int w1){
        ++k;
        a[k].v=v1;a[k].w=w1;a[k].next=first[u1];first[u1]=k; 
}
void dfs(int x){  //从x点开始深搜
    printf("%d ",x);
    for(int i=first[x];i;i=a[i].next){
        int j=a[i].v;
        if(f[j]){
            f[j]=0;
            dfs(j);
        }
    } 
}
void bfs(){   //从x点开始广搜 
    int x=q.front(); q.pop();
    printf("%d ",x);
    for(int i=first[x];i;i=a[i].next){
        int j=a[i].v;
        if(f[j]){
            f[j]=0;
            q.push(j);
        }
    }
    while(!q.empty())
        bfs();    
}
int main(){
    scanf("%d%d",&n,&m);
    memset(first,0,sizeof(first));
    memset(f,1,sizeof(f));
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&u1,&v1,&w1);
        add(u1,v1,w1);
        add(v1,u1,w1);
    }
    //f[1]=0;    dfs(1);
    f[1]=0;q.push(1);
    bfs();
    return 0;

}

以下代码我也不知道拿来干嘛的,但就一起发了吧

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
    int v,next;
}a[2005];
int vi,ui,n,f[1005],m,first[2000];
void add(int vi,int ui,int wi)
{
    k++;
    a[k].v=vi;a[k].next=first[ui];first[ui]=k;
}
void dfs(int x)
{
    printf("%d",a[x].v);
    for(int i=first[x];i;i=a[i].nest)
    {
        int j=a[i].v;
        if(f[j])
        {
            f[j]=0;
            dfs(j);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(f,0,sizeof(f));
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&vi,&ui,&wi);
        add(vi,ui,wi);
    }
    f[1]=0;
    dfs(1)
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44336566/article/details/85369948