| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 520 人关注过本帖
标题:高手请帮忙编一个有关图的题
只看楼主 加入收藏
白马痞子
该用户已被删除
收藏
已结贴  问题点数:10 回复次数:2 
高手请帮忙编一个有关图的题
提示: 作者被禁止或删除 内容自动屏蔽
搜索更多相关主题的帖子: 操作系统 项目 
2010-05-27 22:11
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 20

int visited[MAX_VERTEX_NUM];

typedef char Vertex_Type[5];

typedef enum
{
    DG, DN, UDG, UDN
}Graph_Kind;

typedef struct Arc_Node
{
    int adj_vertex;//邻接定点所在定点向量表中的位置
    int weight;//权值
    struct Arc_Node *next_arc;//指向下一个邻接点
}Arc_Node;

typedef struct Vertex_Node
{
    Vertex_Type data;//表示顶点的类型
    struct Arc_Node *first_arc;//指向第一个邻接顶点
}Vertex_Node;

typedef struct
{
    Vertex_Node vertexs_vectors[MAX_VERTEX_NUM];//顶点向量
    int vertex_num;//顶点数
    int arc_num;//边数
    Graph_Kind kind;//图的类型
}ALGraph;

void Init_ALGraph( ALGraph &G )
{
    printf("输入图的边数:");
    scanf("%d", &G.arc_num);
    printf("输入图的顶点数:");
    scanf("%d", &G.vertex_num);
    printf("输入图的类型(0:DG 1:DN 2:UDG 3:UDN): ");
    scanf("%d", &G.kind);

    printf("初始化顶点向量(例如:v1 v2 v3):");
    for( int i=0; i<G.vertex_num; ++i )
    {
        scanf("%s", G.vertexs_vectors[i].data);
        G.vertexs_vectors[i].first_arc = NULL;//初始值指向空
    }
}

int Get_Vertex_Location( ALGraph G, Vertex_Type V )
{
    for( int i=0; i<G.vertex_num; ++i )
        if( strcmp( G.vertexs_vectors[i].data, V )==0 )
            return i;
    exit(0);//表示操作错误就结束
}
void Create_ALGraph( ALGraph &G )
{
    Init_ALGraph( G );

    Vertex_Type v1, v2;
    int i, v1_site, v2_site;

    printf("输入与弧相关联的顶点和相关信息(v1 -- v2或v1 -> v2)\n");
    for( i=0; i<G.arc_num; ++i )
    {
        scanf("%s %*s %s", v1, v2);
        v1_site = Get_Vertex_Location( G, v1 );
        v2_site = Get_Vertex_Location( G, v2 );

        Arc_Node *p1, *p2;
        p1 = (Arc_Node*) malloc (sizeof(Arc_Node));
        p1->next_arc = G.vertexs_vectors[v1_site].first_arc;
        G.vertexs_vectors[v1_site].first_arc = p1;
        p1->adj_vertex = v2_site;
        p1->weight = 0;//设置不带权的权值全为零

        switch( G.kind )
        {
        case DG://有向图
            break;
        case DN://有向网
            printf("输入权值:");
            scanf("%d", &p1->weight);
            break;
        case UDN://无向网
            printf("输入权值:");
            scanf("%d", &p1->weight);
        case UDG://无向图
            p2 = (Arc_Node*) malloc (sizeof(Arc_Node));
            p2->next_arc = G.vertexs_vectors[v2_site].first_arc;
            G.vertexs_vectors[v2_site].first_arc = p2;
            p2->adj_vertex = v1_site;
            p2->weight = p1->weight;
            break;
        default://表示出错
            exit(0);
        }
    }
}

void Print_ALGraph( ALGraph G )
{
    Arc_Node *p;
    for( int i=0; i<G.vertex_num; ++i )
    {
        p = G.vertexs_vectors[i].first_arc;

        while( p )
        {
            switch( G.kind )
            {
            case DG:
                printf("< %s ->", G.vertexs_vectors[i].data);
                printf(" %s >\n", G.vertexs_vectors[p->adj_vertex].data);
                break;
            case DN:
                printf("< %s ->", G.vertexs_vectors[i].data);
                printf(" %s , %d >\n", G.vertexs_vectors[p->adj_vertex].data, p->weight);
                break;
            case UDG:
                printf("( %s --", G.vertexs_vectors[i].data);
                printf(" %s )\n", G.vertexs_vectors[p->adj_vertex].data);
                break;
            case UDN:
                printf("( %s --", G.vertexs_vectors[i].data);
                printf(" %s , %d )\n", G.vertexs_vectors[p->adj_vertex].data, p->weight);
                break;
            default:
                exit(0);
            }
            p = p->next_arc;
        }
    }
}

int First_Adj_Vertex( ALGraph G, int v )
{
    Arc_Node *p = G.vertexs_vectors[v].first_arc;

    if( !p )
        return -1;
    else
        return Get_Vertex_Location( G, G.vertexs_vectors[p->adj_vertex].data);
}

int Next_Adj_Vertex( ALGraph G, int v, int w )
{
    Arc_Node *p = G.vertexs_vectors[v].first_arc;

    while( p )
    {
        if( p->adj_vertex == w )
            break;
        p = p->next_arc;
    }
    if( !p )
        exit(0);//因为正常情况下w是一定可以找到的
    p = p->next_arc;
    if( p )
        return p->adj_vertex;
    else
        return -1;
}

void DFS( ALGraph G, int v )
{
    visited[v] = 1; printf("%s ", G.vertexs_vectors[v].data);
    for( int w=First_Adj_Vertex( G, v); w>=0; w=Next_Adj_Vertex( G, v, w ) )
        if( !visited[w] )
            DFS( G, w );
}

void DFS_Traverse( ALGraph G )
{
    for( int v=0; v<G.vertex_num; ++v )
        visited[v] = 0;// 表示没有被访问过
    printf("DFS图的遍历序列:");
    for( v=0; v<G.vertex_num; ++v )
        if( !visited[v] )
            DFS( G, v );
    printf("\n");
}

int main()
{
    ALGraph G;

    Create_ALGraph( G );

    Print_ALGraph( G );

    DFS_Traverse( G );

    return 0;
}
2010-05-31 19:18
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-05-31 19:20
快速回复:高手请帮忙编一个有关图的题
数据加载中...
 
   



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

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