记录编号 34000 评测结果 AAAAAAAAAA
题目名称 找最佳通路 最终得分 100
用户昵称 GravatarQhelDIV 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2011-11-24 21:51:29 内存使用 0.27 MiB
显示代码纯文本
  1. #include<fstream>
  2. using namespace std;
  3. ifstream fin("city.in");
  4. ofstream fout("city.out");
  5.  
  6. int Map[51][51],D[51],n,MemberNum;
  7. int From,To,NodePos[51];
  8. bool flag[51];
  9. class HEAP
  10. {
  11. public:
  12. int Data,Name;
  13. int Ls,Rs;
  14. }heap[51];
  15.  
  16. void Swap(int *p,int *q)
  17. {
  18. int tmp;
  19. tmp=*p;
  20. *p=*q;
  21. *q=tmp;
  22. }
  23.  
  24. void Init()
  25. {
  26. int i;
  27. int m;
  28. fin>>n>>m>>From>>To;
  29. int s,e;
  30. for(i=1;i<=m;i++)
  31. {
  32. fin>>s>>e;
  33. Map[s][e]=1;
  34. }
  35. }
  36. void Init_Single_Sourse()
  37. {
  38. int i;
  39. for(i=1;i<=n;i++)
  40. {
  41. heap[i].Ls=i<<1;
  42. heap[i].Rs=heap[i].Ls+1;
  43. }
  44. heap[1].Name=From;
  45. NodePos[From]=1;
  46. MemberNum=1;
  47. }
  48.  
  49. void Min_Heapify(int pos)
  50. {
  51. int R,L,Minpos;
  52. R=heap[pos].Rs;
  53. L=heap[pos].Ls;
  54. Minpos=pos;
  55. if(L>=n && heap[Minpos].Data > heap[L].Data)
  56. Minpos=L;
  57. if(R>=n && heap[Minpos].Data > heap[R].Data)
  58. Minpos=R;
  59. if(Minpos!=pos)
  60. {
  61. Swap(&heap[Minpos].Data,&heap[pos].Data);
  62. Swap(&heap[Minpos].Name,&heap[pos].Name);
  63. Swap(&NodePos[heap[Minpos].Name],&NodePos[heap[pos].Name]);
  64. Min_Heapify(Minpos);
  65. }
  66. }
  67.  
  68. void Dec(int pos)
  69. {
  70. int Next,i=pos;
  71. for(Next=i>>1; Next | 0; (i>>=1),(Next>>=1))
  72. if(heap[Next].Data > heap[i].Data)
  73. {
  74. Swap(&heap[i].Data,&heap[Next].Data);
  75. Swap(&heap[i].Name,&heap[Next].Name);
  76. Swap(&NodePos[heap[i].Name],&NodePos[heap[Next].Name]);
  77. }
  78. else
  79. break;
  80. }
  81.  
  82. void Extract_Min()
  83. {
  84. NodePos[heap[MemberNum].Name]=1;
  85. Swap(&heap[1].Data,&heap[MemberNum].Data);
  86. Swap(&heap[1].Name,&heap[MemberNum].Name);
  87. NodePos[heap[MemberNum].Name]=0;
  88. MemberNum--;
  89. Min_Heapify(1);
  90. }
  91. void Dijkstra()
  92. {
  93. int Minpos,i;
  94. Init_Single_Sourse();
  95. for(;MemberNum | 0;)
  96. {
  97. Minpos=heap[1].Name;
  98. flag[Minpos]=true;
  99. NodePos[Minpos]=1;
  100. D[Minpos]=heap[1].Data;
  101. Extract_Min();
  102. for(i=1;i<=n;i++)
  103. if(Map[Minpos][i] && !flag[i])
  104. {
  105. if(NodePos[i]==0)
  106. {
  107. MemberNum++;
  108. heap[MemberNum].Data=D[Minpos]+Map[Minpos][i];
  109. heap[MemberNum].Name=i;
  110. NodePos[heap[MemberNum].Name]=MemberNum;
  111. Dec(MemberNum);
  112. }
  113. else
  114. {
  115. int U=Map[Minpos][i] + D[Minpos];
  116. if(U < heap[NodePos[i]].Data)
  117. {
  118. heap[NodePos[i]].Data=U;
  119. Dec(NodePos[i]);
  120. }
  121. }
  122. }
  123. }
  124. }
  125.  
  126. int main()
  127. {
  128. Init();
  129. Dijkstra();
  130. fout<<D[To]+1<<endl;
  131. fin.close();
  132. fout.close();
  133. return 0;
  134. }
  135. /*
  136. Swap(&,&);
  137. Swap(&,&);
  138. Swap(&,&);
  139. */