【模板】图的存储

介绍5种存图的方法

1.邻接矩阵

const int  N =1e3+9;
int G[N][N];//G[i][j]即val(i->j)
void dfs(int u){
    vis[u] = 1;
    for(int v=1 ; v<=n ; ++v){
        if(G[u][v]!=0){
            printf("%d %d %d ",u,v,G[u][v]);
            if(!vis[v]) dfs(v);
        }
    }
}
void bd(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int u,v,val;
        cin>>u>>v>>val;
        G[u][v] = val;
        //G[v][u] = val;//无向图   
    }
    for(int i=1 ; i<=n ; ++i){
        if(!vis[i]) dfs(i);
    }
}

2.边集数组

struct node{
    int u ,v, val;
	//start end value
}
bool vis[N];
void dfs(int u){
    vis[u] = 1;
    for(int i=1 ; i<=m ; ++i){
        if(e[i].u == u){
            int end = e[i].v;
            int value = e[i].value;
            printf("%d %d ,%d ",u,end,value);
        }
    }
}
void bd(){
    cin>>n>>m;
    for(int i =1 ; i<=m;++i{
        int u,v,val;
        cin>>u>>v>>val;
        e[i].u=u;
        e[i].v=v;
        e[i].val = val;
    }
	for(int i=1;i<=n;++i){
        if(!vis[i]) dfs(i);
}

3.邻接表

struct node{
    int v,val;
};
vec<node>edge[N];

void dfs(int u){
    vis[u]=1;
    for(int i=0;i<e[u].size();++i){
        int end = e[u][i].v;
        int val = e[u][i].val;
        printf("(%d,%d) %d",u,end,val);
        if(!vis[end]) dfs(end);
    }
}
void bd(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int v,val;
        cin>>v>>val;
        edge[u].push_back({v,val});
    }
    for(int i=1;i<=n;++i){
        if(!vis[i]) dfs(i);
    }
}

4.链式邻接表

struct node{
    int u,v,val;
};
vec<node>e;
bool vis[N];
vec<int>head[N];
void add(int u,int v,int w){
    e.push_back({u,v,w});
    h[u].push_back(e.size()-1);
}
void dfs(int u){
    vis[u]=1;
    for(int i=0;i<h[u].size();++i){
     	int idx = h[u][j];
        int next = e[idx].v;
        int val = e[idx].val;
        printf("(%d,%d) %d",u,next,val);
        if(!vis[next]) dfs(next);
    }
}
void bd(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int u,v,w;
        add(u,v,w);
    }
    for(int i=n;i<=n;;++i){
        if(!vis[i]) dfs(i);
    }
}

5.链式前项星

struct node{
    int to,val,next;
};
int head[N],idx=0;
node e[N];
void add(int u,int v,int val){
    e[idx] = {v,val,head[u]};
    head[u] = idx++;
}
void dfs(int u){
    vsi[u]=1;
    for(int i=head[u];i!=-1;i=e[i].next){
    	int v= e[i].to
        int val = e[i].val;
        printf("%d %d %d",,u,v,val);
        if(!vis[u) dfs(v);
    }
}
void bd(){
    cin>>n>>m;
    memset(head,-1,sizeof(head));
    for(int i=1;i<=m;++i){
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
    }
   	for(int i=1;i<=n;++i){
        if(!vis[i) dfs(i);
    }
}
posted @ 2024-08-01 19:03  phrink  阅读(16)  评论(0)    收藏  举报