HDU3790 最短路径问题

 1 #include<stdio.h>

 2 #include<string.h>

 3 #define MAX 0x7ffffff

 4 struct G {

 5     int d;

 6     int p;

 7 }map[1001][1001];

 8 struct D {

 9     int d;

10     int p;

11 }dist[1001];

12 bool vis[1001];

13 int m,n,s,e;

14 void dijkstra()

15 {

16     int i,j,k,min;

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

18         for(min=MAX,j=1;j<=n;j++){

19             if(!vis[j]&&min>dist[j].d){

20                 min=dist[j].d;

21                 k=j;

22             }

23         }

24         vis[k]=1;

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

26             if(!vis[j]){

27                 if(dist[j].d>dist[k].d+map[k][j].d){

28                     dist[j].d=dist[k].d+map[k][j].d;

29                     dist[j].p=dist[k].p+map[k][j].p;

30                 }else if(dist[j].d==dist[k].d+map[k][j].d&&dist[j].p>dist[k].p+map[k][j].p){

31                     dist[j].p=dist[k].p+map[k][j].p;

32                 }

33             }

34         }

35     }

36     printf("%d %d\n",dist[e].d,dist[e].p);

37 }

38 void init()

39 {

40     int i,j;

41     int a,b,d,p;

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

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

44             map[i][j].d=map[j][i].d=MAX;

45             map[i][j].p=map[j][i].p=MAX;

46         }

47         map[i][i].d=map[i][i].p=0;

48     }

49     for(i=0;i<m;i++) {

50         scanf("%d%d%d%d",&a,&b,&d,&p);

51         if(map[a][b].d>d){

52             map[a][b].d=map[b][a].d=d;

53             map[a][b].p=map[b][a].p=p;

54         }else if(map[a][b].d==d&&map[a][b].p>p){

55             map[a][b].p=map[b][a].p=p;

56         }

57     }

58     scanf("%d%d",&s,&e);

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

60         dist[i].d=map[s][i].d;

61         dist[i].p=map[s][i].p;

62     }

63     memset(vis,0,sizeof(vis));

64     vis[s]=1;

65     dist[s].d=dist[s].p=0;

66 } 

67 int main()

68 {

69     while(scanf("%d%d",&n,&m),n||m){

70         init();

71         dijkstra();

72     }

73     return 0;

74 } 

我用dijkstra做的,还可以用其他方法去做!如:SPFA

你可能感兴趣的:(最短路径)