hdoj 2544 最短路

题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2544

分析:Dijkstra算法

 1 //2013-10-30 10:01:25    Accepted    2544    15MS    340K    1824 B    C++    空信高手

 2 #include <iostream>

 3 using namespace std;

 4 

 5 /*==================================================*\

 6  | Dijkstra 数组实现O (N^2 )

 7 | Dijkstra --- 数组实现( 在此基础上可直接改为STL 的Queue实现)

 8  | lowcost[] --- beg 到其他点的最近距离

 9 | path[] -- beg为根展开的树,记录父亲结点

10 \*==================================================*/

11 #define INF 0x3F3F3F3F;

12 const int N=110;

13 int path[N],vis[N];

14 int cost[N][N];

15 void Dijkstra(int lowcost[N],int n,int beg)

16 {

17     int i,j,min;

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

19     vis[beg]=1;

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

21     {

22         lowcost[i]=cost[beg][i];

23         path[i]=beg;

24     }

25     lowcost[beg]=0;

26     path[beg]=-1;

27     int pre=beg;

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

29     {

30         min=INF;

31         for(j=0; j<n; j++)

32             //下面的加法可能导致溢出,INF不能取太大

33             if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j])

34             {

35                 lowcost[j]=lowcost[pre]+cost[pre][j];

36                 path[j]=pre;

37             }

38         for(j=0; j<n; j++)

39             if(vis[j]==0&&lowcost[j]<min)

40             {

41                 min=lowcost[j];

42                 pre=j;

43             }

44         vis[pre]=1;

45     }

46 }

47 void Init()

48 {

49     int i,j;

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

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

52             cost[i][j]=INF;

53 }

54 

55 int main()

56 {

57  //  freopen("input.txt","r",stdin);

58     int n,m,i,a,b,dis;

59     while(cin>>n>>m&&!(n==0&&m==0))

60     {

61         Init();

62         int lowcost[N];

63         for(i=0; i<m; i++)

64         {

65             cin>>a>>b>>dis;

66             if(cost[a-1][b-1]>dis)

67                 cost[a-1][b-1]=cost[b-1][a-1]=dis;

68         }

69         Dijkstra(lowcost,n,0);

70         cout<<lowcost[n-1]<<endl;

71 //        if( lowcost[n-1] < 0x3F3F3F3F ) cout<<lowcost[n-1]<<endl;

72 //        else cout<<"-1"<<endl;

73     }

74     return 1;

75 }

 

 

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