急求 图的最短路径问题的程序…数据结构类…具体要求如下…急啊…

1个回答

  • 一:

    #include "stdafx.h"

    #include

    #include

    #include

    using namespace std;

    const int MAXINT = numeric_limits

    ::max();

    template

    void Dijkstra(int n, int v, Type dist[], int prev[], Type** c)

    {

    bool *s = new bool[n+1];

    int i, j;

    for(i = 1; i <=n; i++)

    {

    dist[i] = c[v][i];

    if(c[v][i]!=MAXINT)

    prev[i] = v;

    else prev[i] =0;

    s[i] = false;

    }

    s[v] = true;

    dist[v] = 0;

    prev[v] = 0;

    for(i = 1; i< n; i++)

    {

    int u = v;

    int temp = MAXINT;

    for( j = 1; j<=n; j++)

    if(!s[j]&&dist[j]

    {

    u = j;

    temp = dist[j];

    }

    s[u] = true;

    for(j=1; j<=n; j++)

    {

    if((!s[j])&&c[u][j]

    {

    if((dist[u]+c[u][j])

    {

    dist[j] = dist[u] + c[u][j];

    prev[j] = u;

    }

    }

    }

    }

    delete [] s;

    }

    void djpath(int m, int v, int prev[])

    {

    int i = m ,j =1;

    while(i!=0)

    {

    if (j == 1)

    {

    cout<< i;

    j = 0;

    }

    else

    cout<< "-" << i;

    i = prev[i];

    }

    cout<

    }

    int _tmain(int argc, _TCHAR* argv[])

    {

    cout< int prev[6], dist[6];

    int i,j,n;

    int** myc;

    FILE *fp;

    fp=fopen("data.txt", "r");

    fscanf(fp,"%d", &n);

    myc = new int* [n+1];

    for(i =0; i<=n; i++)

    myc[i] = new int[n+1];

    for(i=1; i<=n; i++)

    for(j =1; j<=n; j++)

    {

    fscanf(fp, "%d",&myc[i][j]);

    if (myc[i][j]==-1)

    myc[i][j] = MAXINT;

    }

    Dijkstra(5, 1, dist, prev, myc);

    for(i = 1; i<=5; i++)

    cout<

    for(i=2; i<=5; i++)

    djpath(i,1,prev);

    for(i = 0; i<=5; i++)

    delete[] myc[i];

    delete [] myc;

    return 0;

    }

    输入数据采用文本文件格式,下面是data.txt的内容:

    5

    0 10 -1 30 100

    10 0 50 -1 -1

    -1 50 0 20 10

    30 -1 20 0 60

    100 -1 10 60 0

    本文来自CSDN博客,转载请标明出处:

    二:

    #include

    using namespace std;

    void main()

    {

    int infinity=100,j,i,n,k,t,**w,*s,*p,*d;

    cout>n;

    cout<

    d=new int[n];

    s=new int[n];

    p=new int[n];

    w=new int*[n];

    for(i=0;i

    for(i=0;i

    for(j=0;j

    cin>>w[i][j];

    for(s[0]=1,i=1;i

    {

    s[i]=0;d[i]=w[0][i];

    if(d[i]

    else p[i]=-1;

    }

    for(i=1;i

    {

    t=infinity;k=1;

    for(j=1;j

    if((!s[j])&&(d[j]

    s[k]=1;//point k join the S

    for (j=1;j

    。且D[j]减小的新路径P只可能是由于路径

    和边

    组成。所以,当length(P)=D[k]+w

    小于D[j]时,应该用P的长度来修改D[j]的值。

    if((!s[j])&&(d[j]>d[k]+w[k][j]))

    }

    cout

    }

    以上二个代码都是完整可以使用的,楼主喜欢哪个就用那个吧。自己还是可以仔细分析下代码。