| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 560 人关注过本帖
标题:各位帮我看看程序有没有问题
只看楼主 加入收藏
BYSF_XF
Rank: 2
等 级:论坛游民
帖 子:89
专家分:75
注 册:2011-4-25
结帖率:88.89%
收藏
已结贴  问题点数:10 回复次数:6 
各位帮我看看程序有没有问题
下面是一个求最短路径的程序,我没有看例子,全部是根据算法自己写的,弄了几个图试了一下,貌似没有问题,但总感觉有点问题,请各位高手先看看有没有问题。如果没有问题,也可以教我怎么改进一下
程序代码:
#include<stdio.h>
#include<malloc.h>
#define MAX_X 20
#define MAX_Y 20
struct Path
{
    int power[MAX_X];//源点到此顶点的权和
    int  prev[MAX_X];//此顶点的直接前驱顶点,如果为0则是源点
};
struct Graph
{
    int m;//顶点数
    char P[MAX_X];//顶点信息
    int G[MAX_X][MAX_Y];//边和权
};
//函数声明
Graph *create(void);//创建并录入网信息
void print(Graph *graph);//输出网的信息
Graph *create()
{
    Graph *graph=(Graph *)malloc(sizeof(Graph));
    printf("请输入顶点数 边数:");
    int n;
    scanf("%d %d",&graph->m,&n);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            graph->G[i][j]=32767;//初始化
    }
    printf("请输入顶点信息:\n");
    for(i=0;i<graph->m;i++)
    {
        getchar();
        printf("顶点%d:>",i+1);
        scanf("%c",&graph->P[i]);
    }
    printf("请输入边和权<Vi,Vj,W>\n");
    for(i=0;i<n;i++)
    {
        char Vi,Vj;
        int w;
        int x,y;
        getchar();
        printf("第%d条边:",i+1);
        scanf("<%c,%c,%d>",&Vi,&Vj,&w);
        for(x=0;x<graph->m;x++)
            if(Vi==graph->P[x])
                break;
        for(y=0;y<graph->m;y++)
            if(Vj==graph->P[y])
                break;
        graph->G[x][y]=w;
    }
    return graph;
}
void print(Graph *graph)
{
    for(int i=0;i<graph->m;i++)
    {
        for(int j=0;j<graph->m;j++)
        {
            if(graph->G[i][j]!=32767)
            {
                printf("%c  —>  %c   %d\n",graph->P[i],graph->P[j],graph->G[i][j]);
            }
        }
    }
}
Path *MinPath(Graph *graph)
{
    int queue[MAX_X],front=0,rear=0;
    Path *path=(Path *)malloc(sizeof(Path));
    for(int i=0;i<MAX_X;i++)//初始化
    {
        path->power[i]=32767;
        path->prev[i]=0;
    }
    path->power[0]=0;
    path->prev[0]=-1;
    queue[rear++]=0;//源点入队
    while(front!=rear)//未遍历完所有顶点
    {
        int k=queue[front];
        for(int i=0;i<graph->m;i++)//遍历与k相关联的顶点
        {
            if(k==i)
                continue;
            if(graph->G[k][i]!=32767)//路径存在
            {
                if((graph->G[k][i]+path->power[k])<path->power[i])//找到 k——>i 更短的路径
                {
                    path->power[i]=graph->G[k][i]+path->power[k];
                    path->prev[i]=k;//i的直接前驱为k
                    int j;
                    for(j=0;j<rear;j++)//检查是否入过队
                    {
                        if(i==queue[j])
                            break;
                    }
                    if(j>=rear)//未入过队
                        queue[rear++]=i;//i入队
                }
            }
        }
        front++;//k出队
    }
    return path;
}
void print_p(Path *path,Graph *graph)
{
    for(int i=0;i<graph->m;i++)
    {
        int a[MAX_X],top=0;
        if(path->prev[i]==-1)
            continue;//不输入源点—>源点的路径
        else
        {
            int n=i;
            while(path->prev[n]!=0)//直接前驱不是源点
            {
                a[top++]=path->prev[n];//前驱顶点入栈
                n=path->prev[n];//进入直接前驱顶点路径
            }
            printf("A —> ");
            for(int j=top-1;j>=0;j--)
            {
                printf("%c —> ",graph->P[a[j]]);
            }
            printf("%c\t\t%d\n",graph->P[i],path->power[i]);
        }
    }
}
int main()
{
    Graph *graph=create();
    print(graph);
    printf("\n\n");
    Path *path=MinPath(graph);
    print_p(path,graph);
    getchar();
    getchar();
    getchar();
    return 0;
}

2011-12-05 10:28
gaochizhen33
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:114
专家分:101
注 册:2010-11-4
收藏
得分:3 
程序代码:
Graph *graph=(Graph *)malloc(sizeof(Graph));
if(NULL == graph)                //并不是所有的内存分配都会成功,注意进行一下判断,这只是一个良好的习惯。初始化最好也能进行。
{
    printf("malloc error!\n");
    exit;                       
}

2011-12-05 10:50
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:3 
有输入的要按照一定的顺序,否则得到错误的答案。我发不了截图。我输入的顺序不同得到完全不同的答案。
2011-12-05 20:57
原味好
Rank: 4
来 自:西安
等 级:业余侠客
帖 子:59
专家分:250
注 册:2011-11-29
收藏
得分:3 
我和上面的一样
2011-12-05 21:22
BYSF_XF
Rank: 2
等 级:论坛游民
帖 子:89
专家分:75
注 册:2011-4-25
收藏
得分:0 
回复 2楼 gaochizhen33
好的,谢谢
2011-12-06 22:33
BYSF_XF
Rank: 2
等 级:论坛游民
帖 子:89
专家分:75
注 册:2011-4-25
收藏
得分:0 
回复 3楼 laznrbfe
为什么我的是样的呢
2011-12-06 22:39
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 6楼 BYSF_XF
比如 <a,c,3>....
如果我输入<c,a,3>...就会得不到正确答案。
2011-12-08 23:21
快速回复:各位帮我看看程序有没有问题
数据加载中...
 
   



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

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