PAT Emergency

Emergency

 

还是dijkstra算法  稍有变形  在长度相同的时候 更新人数和路径条数

注意  最后输出的是 最短路径的条数   是条数! 

 

AC代码

 1 #include <stdio.h>

 2 #define MAX 1000000

 3 

 4 int N,M,S,D;

 5 int g[500][500];

 6 int dis[500];

 7 int cost[500];

 8 int cost1[500];

 9 int flag[500];

10 int path[500];

11 void Dijkstra(int v)

12 {

13     int min,i,j,pos;

14     cost[v]=cost1[v];

15     path[v]=1;

16     dis[v]=0;

17     for(i=0;i<N;i++)

18     {

19         min=MAX;                

20         for(j=0;j<N;j++)

21         {

22             if(flag[j]!=1 && dis[j]<min)

23             {

24                 min=dis[j];

25                 pos=j;

26             }        

27         }        

28         flag[pos]=1;    

29         for(j=0;j<N;j++)

30         {

31             if(flag[j]!=1)

32             {

33                 if(dis[pos]+g[pos][j]<dis[j])

34                 {

35                     dis[j]=dis[pos]+g[pos][j];

36                     cost[j]=cost[pos]+cost1[j];

37                     path[j]=path[pos];

38                 }

39                 else if(dis[pos]+g[pos][j]==dis[j] )

40                 {

41                     path[j] += path[pos];

42                     if(cost[j]<cost[pos]+cost1[j])

43                         cost[j]=cost[pos]+cost1[j];

44                 }    

45             }

46             

47         }

48     }

49     printf("%d %d\n",path[D],cost[D]);    

50 }

51 main()

52 {

53     int a,b,l,c;

54     int i,j;

55     scanf("%d%d%d%d",&N,&M,&S,&D);

56     for(i=0;i<N;i++)

57     {    

58         scanf("%d",&cost1[i]);

59         dis[i]=MAX;

60         for(j=0;j<N;j++)

61             g[i][j]=MAX;

62         

63     }

64     for(i=0;i<M;i++)

65     {

66         scanf("%d%d%d",&a,&b,&l);

67         g[a][b]=g[b][a]=l;

68     }

69     Dijkstra(S);

70 }

 

你可能感兴趣的:(merge)