记录编号 122447 评测结果 AAAAAAAAAA
题目名称 旅行 最终得分 100
用户昵称 GravatarHouJikan 是否通过 通过
代码语言 C++ 运行时间 0.028 s
提交时间 2014-09-23 18:46:52 内存使用 0.37 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <cstdlib>
  7. #include <map>
  8. #include <set>
  9. #include <list>
  10. #include <iterator>
  11. #include <ctime>
  12. #include <queue>
  13. #include <stack>
  14. #include <vector>
  15. #include <functional>
  16. #include <deque>
  17. #define For(i,j,k) for(int i=(j);i<=(k);i++)
  18. using namespace std;
  19. typedef long long LL;
  20. typedef unsigned int Uint;
  21. const int INF=0x7fffffff;
  22. const double eps=1e-6;
  23. using namespace std;
  24. //================struct declaration======================
  25.  
  26. //================var declaration=-========================
  27. const int MAXN=110;
  28. int scc_cnt=0,n,m,k;
  29. stack <int> S;
  30. bool ins[MAXN];
  31. int scc[MAXN],dist[MAXN][MAXN],d[MAXN][20],pre[MAXN],low[MAXN],Index;
  32. //================function declaration====================
  33. void tarjan(int x);
  34. void spfa(int s,int e);
  35. //================main code===============================
  36. int main()
  37. {
  38. string ProgrammeName="travela";
  39. string FloderName="COGS";
  40. freopen((ProgrammeName+".in").c_str(),"r",stdin);
  41. freopen((ProgrammeName+".out").c_str(),"w",stdout);
  42. #ifdef DEBUG
  43. clock_t Start_Time=clock();
  44. system(("cp C:\\Users\\Administrator\\Desktop\\"+FloderName+"\\standard.cpp C:\\Users\\Administrator\\Desktop\\"+FloderName+"\\submit.txt").c_str());
  45. #endif
  46. while (scanf("%d%d%d",&n,&m,&k)!=EOF)
  47. {
  48. if (m==0&&k==0&&n==0)
  49. break;
  50. scc_cnt=0;
  51. memset(scc,0,sizeof(scc));
  52. memset(dist,-1,sizeof(dist));
  53. memset(pre,0,sizeof(pre));
  54. memset(low,0,sizeof(low));
  55. memset(ins,false,sizeof(ins));
  56. Index=0;
  57. For(i,1,m)
  58. {
  59. int s,e,t;
  60. scanf("%d%d%d",&s,&e,&t);
  61. s++;e++;
  62. t*=2;
  63. if (dist[s][e]==-1||dist[s][e]>t)
  64. dist[s][e]=t;
  65. }
  66. tarjan(1);
  67. spfa(1,n);
  68. }
  69. #ifdef DEBUG
  70. clock_t End_Time=clock();
  71. printf("\n\nTime Used :%.6lf Ms\n",double(Start_Time-End_Time)/(-CLOCKS_PER_SEC));
  72. #endif
  73. return 0;
  74. }
  75. //================function code===========================
  76. void tarjan(int x)
  77. {
  78. pre[x]=low[x]=++Index;
  79. S.push(x);
  80. ins[x]=true;
  81. For(i,1,n)
  82. if (dist[x][i]!=-1)
  83. {
  84. if(pre[i]==0)
  85. {
  86. tarjan(i);
  87. low[x]=min(low[x],low[i]);
  88. }
  89. else if (ins[i])
  90. low[x]=min(pre[i],low[x]);
  91. }
  92. if (pre[x]==low[x])
  93. {
  94. scc_cnt++;
  95. int v=-1;
  96. do
  97. {
  98. v=S.top();
  99. scc[v]=scc_cnt;
  100. S.pop();
  101. ins[v]=false;
  102. }while (v!=x);
  103. }
  104. return ;
  105. }
  106. void spfa(int s,int e)
  107. {
  108. memset(d,-1,sizeof(d));
  109. memset(ins,0,sizeof(ins));
  110. queue <int> Q;
  111. Q.push(s);
  112. d[s][0]=0;
  113. while (!Q.empty())
  114. {
  115. int now=Q.front();Q.pop();
  116. ins[now]=false;
  117. For(i,1,n)
  118. {
  119. if (dist[now][i]==-1) continue;
  120. int dis;
  121. if (scc[now]==scc[i])
  122. {
  123. dis=dist[now][i]/2;
  124. For(j,0,k)
  125. if (d[now][j]!=-1&&(d[i][j]==-1||d[i][j]>d[now][j]+dis))
  126. {
  127. d[i][j]=d[now][j]+dis;
  128. if (!ins[i])
  129. ins[i]=true,Q.push(i);
  130. }
  131. }
  132. else
  133. {
  134. dis=dist[now][i];
  135. For(j,0,k)
  136. if (d[now][j]!=-1&&(d[i][j+1]==-1||d[i][j+1]>d[now][j]+dis))
  137. {
  138. d[i][j+1]=d[now][j]+dis;
  139. if (!ins[i])
  140. ins[i]=true,Q.push(i);
  141. }
  142. }
  143. }
  144. }
  145. int ans=-1;
  146. For(i,0,k)
  147. if (d[e][i]>0&&(d[e][i]<ans||ans==-1))
  148. ans=d[e][i];
  149. printf("%d\n",ans);
  150. }