hdu 3790 最短路径问题

http://acm.hdu.edu.cn/showproblem.php?pid=3790

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define maxn 1001

 5 using namespace std;

 6 const int inf=1<<28;

 7 

 8 int g[maxn][maxn];

 9 int cost[maxn][maxn];

10 int n,m,a,b,d,p,s,e;

11 bool vis[maxn];

12 int dis[maxn],c[maxn];

13 

14 void inti()

15 {

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

17     {

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

19         {

20             if(i==j)

21             {

22                 g[i][j]=0;

23                 cost[i][j]=0;

24             }

25             else

26             {

27                 g[i][j]=inf;

28                 cost[i][j]=inf;

29             }

30         }

31     }

32 }

33 

34 void dijkstra(int str)

35 {

36     memset(vis,false,sizeof(vis));

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

38     {

39         dis[i]=g[str][i];

40         c[i]=cost[str][i];

41     }

42     dis[str]=0;

43     c[str]=0; vis[str]=true;

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

45     {

46         int m=inf,x;

47         for(int y=1; y<=n; y++)  if(!vis[y]&&dis[y]<m) m=dis[x=y];

48         vis[x]=true;

49         for(int y=1; y<=n; y++)

50         {

51             if(!vis[y]&&g[x][y]!=inf)

52             {

53                 if(dis[y]>dis[x]+g[x][y])

54                 {

55                     dis[y]=dis[x]+g[x][y];

56                     c[y]=c[x]+cost[x][y];

57                 }

58                 else if(dis[y]==dis[x]+g[x][y])

59                 {

60                     if(c[y]>c[x]+cost[x][y])

61                         c[y]=c[x]+cost[x][y];

62                 }

63             }

64         }

65     }

66 }

67 int main()

68 {

69     while(scanf("%d%d",&n,&m)!=EOF)

70     {

71         if(n==0&&m==0) break;

72         inti();

73         for(int i=0; i<m; i++)

74         {

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

76             if(d<g[a][b])

77             {

78                 g[a][b]=g[b][a]=d;

79                 cost[a][b]=cost[b][a]=p;

80             }

81 

82         }

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

84         dijkstra(s);

85         printf("%d %d\n",dis[e],c[e]);

86     }

87     return 0;

88 }
View Code

 

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