回 帖 发 新 帖 刷新版面

主题:哪位高手帮帮忙看下程序什么地方出错吧~~~

算法实验题7.3 最长简单路径问题
«问题描述:
试设计一个算法,对于给定的带权有向图,计算出该图中指定顶点为起点和终点的最长
简单路,并分析算法的计算时间复杂性。
«实验任务:
对于给定的图G 和G 中的2 个顶点v和w,计算从v到w的最长简单路。
«数据输入:
由文件input.txt 给出输入数据。第1 行有2 个正整数n 和m,表示给定的图G 有n 个
顶点和m条边,顶点编号为1,2,…,n。接下来的m行中,每行有3 个正整数u,v,w,表
示图G 的一条边(u,v)及其边权w。第m+1 行是一个正整数k,表示要计算k 对顶点间的最
长简单路。接下来的k 行中,每行有2 个正整数s 和t,表示要计算顶点对s 和t 间的最长
简单路。
«结果输出:
将计算出的各顶点对间的最长简单路长依次输出到文件output.txt。如果不存在满足要
求的简单路,则输出-1。
输入文件示例 输出文件示例
input.txt          output.txt
7 10             102
1 2 –5            103
1 3 –6            -1
1 6 1
1 7 13
2 3 100
3 4 1
3 5 1
4 5 1
5 6 1
5 7 1
3
2 5
2 6
2 1

下面就是代码拉:
#include <stdio.h>
#define MAX 101
typedef struct Graph
{
    int arc[MAX][MAX];
    int v_num,a_num;
}Graph;

typedef struct DistType
{
    int Length;
    int Flag;
}DistType;

int  GetPath(Graph g,int Source,int Dest)
{
    int i,Count=0;
    int intMax=0;
    int intPos;
    DistType dist[MAX];
    int path[MAX];//前趋节点

    for(i=1;i<=g.v_num;i++)
    {
        dist[i].Flag =0;
        dist[i].Length =g.arc[Source][i];
        if(g.arc[Source][i]!=0) 
            path[i]=Source;
        else
            path[i]=-1;
    }
    dist[Source].Length=0;
    dist[Source].Flag=1;
    while(Count<g.v_num)
    {
        intMax=-10000;
        intPos=1;
        for(i=1;i<=g.v_num;i++)
        {
            if(dist[i].Flag==0&&dist[i].Length>intMax)
            {
                intMax=dist[i].Length;
                intPos=i;
            }
        }
        dist[intPos].Flag =1;
        Count++;
        for(i=1;i<=g.v_num;i++)
        {
            if(dist[i].Flag ==0&&dist[i].Length+g.arc[intPos][i]>dist[i].Length)
            {
                dist[i].Length=dist[i].Length +g.arc[intPos][i];
                path[i]=intPos;
            }
        }
    }
    return dist[Dest].Length;
}
void main()
{
    int t,k,l,i,j;
    int Source,Dest;
    int ivex,jvex;
    Graph g;
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    scanf("%d %d",&g.v_num,&g.a_num);
    for(i=1;i<=g.v_num;i++)
        for(j=1;j<=g.v_num;j++)
            g.arc[i][j]=0;         
    for(j=1;j<=g.a_num;j++)
    {
        scanf("%d %d",&ivex,&jvex);
        scanf("%d",&g.arc[ivex][jvex]);
        printf("\n");
    }
    scanf("%d",&k);
    for(t=1;t<=k;t++)
    {
        scanf("%d %d",&Source,&Dest);
        printf("%d\n",GetPath(g,Source,Dest));
    }

}

回复列表 (共2个回复)

沙发

建议你每次接收输入之前,刷新输入缓冲,看看能不能解决问题。。。

板凳

有点不太懂恩...高手可以说清楚点不啊?

我来回复

您尚未登录,请登录后再回复。点此登录或注册