急求 图的最短路径问题的程序…数据结构类…具体要求如下…急啊…
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

}

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