| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1600 人关注过本帖
标题:数据结构
只看楼主 加入收藏
倾听心跳
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:153
注 册:2016-6-22
结帖率:60%
收藏
 问题点数:0 回复次数:0 
数据结构
题目描述
求图的DFS序列及BFS序列。图的顶点数<=20,边数<=100。

输入
图用邻接表存储。

图中的顶点用一个结构体数组存储,结构体定义如下:

typedef struct tnode
{   int vexdata;
    struct node *firstarc;
}TD;

图中各顶点后接一个单链表,存储与顶点连接有边的邻接顶点信息,邻接顶点信息用结构体存储,定义如下:

typedef struct node
{   int adjvex;
    struct node *next;
}JD;

程序运行时,先输入图的顶点个数及边的条数。注意,对于无向图而言,2顶点间的边算2条边。

然后输入顶点数据。

然后输入各条边信息,包括边的起点的值,终点的值(并不是点的序号)。

说明:为保证答案的唯一性,要求邻接表在建立各顶点后的单链表时,用头插法插入新来的结点。

输出
(这里是输出点的序号,序号是从1开始的)。

第一行输出DFS序列,序列中数字用逗号隔开。

第二行输出BFS序列,序列中数字用逗号隔开。
程序代码:
[code]#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

queue<int> qe;
int bfs_sq[25],vex[25],in[25][25],vis[25],n,dfs_sq[25],l1,l2;
int search(int val)
{
    for(int i = 0;i < n;i++)
        if(vex[i] == val) return i;     //Ñ°Õò¶Ôó|êy¾YμıàoÅ
}

void dfs(int x)
{
    if(vis[x] ) return ;
    else {
        dfs_sq[l1++]=x;
        vis[x]=1;
    }
    for(int i = in[x][0];i >= 0;i--){
        if(!vis[ in[x][i] ] ) {
            dfs(in[x][i]);
        }
    }
}
void bfs(int x)
{
    if(vis[x] ) return ;
    else {
        bfs_sq[l2++]=x;
        vis[x]=1;
    }
    for(int i = in[x][0];i >= 0;i--){
        if(!vis[ in[x][i] ] ) {
            qe.push(in[x][i]);
        }
    }
    while(!qe.empty()) {           //¶óáD  BFS
        x=qe.front(),qe.pop(),bfs(x);
    }
}
int main()
{
    int i,j,m,st,ed;
    while(~scanf("%d,%d",&n,&m)){
        memset(in,0,sizeof(in));
        for(i = 0;i < n;i++) cin>>vex[i];
        for(i = 0;i < m;i++) {
            scanf("%d,%d",&st,&ed);
            st=search(st),ed=search(ed);
            j=1;
            while(in[st][j]){        //0oÅλÖÃ′æáú½ó±ßμĸöêy
                j++;
            }
            in[st][0]=j,in[st][j]=ed;
        } 
        l1=l2=0;       //3õê¼»ˉ
        memset(vis,0,sizeof(vis));      //Çå3t±ê¼Ç
        for(i = 0;i < n;i++){
            if(!vis[i]) dfs(i);
        }
        memset(vis,0,sizeof(vis));
        for(i = 0;i < n;i++){
            if(!vis[i]) bfs(i);
        }
        for(i = 0;i < l1;i++){        //′e°¸êä3ö
            if(i!=n-1)
                printf("%d,",dfs_sq[i]+1);
            else    printf("%d\n",dfs_sq[i]+1);
        }
        for(i = 0;i < l2;i++){
            if(i!=l2-1)
                printf("%d,",bfs_sq[i]+1);
            else    printf("%d\n",bfs_sq[i]+1);
        }
    }
    return 0;
}
[/code]

有没简单点的方法,求大神修改
搜索更多相关主题的帖子: 结构体 信息 
2016-06-24 10:17
快速回复:数据结构
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034401 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved