比赛 20120703 评测结果 AAAAAAAAAA
题目名称 旅行 最终得分 100
用户昵称 Satoshi 运行时间 0.046 s
代码语言 C++ 内存使用 0.36 MiB
提交时间 2016-02-21 08:40:05
显示代码纯文本
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <queue>
  4. #include <vector>
  5. #define N 110
  6. using namespace std;
  7. ifstream in("travela.in");
  8. ofstream out("travela.out");
  9. int n,m,K;
  10. int dfn[N]={0},low[N]={0};
  11. int tim=0;
  12. vector<int > G[N],C[N];
  13. bool l[N]={0};
  14. int f[N][N]={0};
  15. int s[N]={0},cnt=0;
  16. int color[N]={0};
  17. int INF=(1<<28);
  18. void tarjan(int u)
  19. {
  20. int i,v;
  21. dfn[u]=low[u]=++tim;
  22. l[u]=1;
  23. s[++s[0]]=u;
  24. for(i=0;i<G[u].size();i++)
  25. {
  26. v=G[u][i];
  27. if(!dfn[v])
  28. {
  29. tarjan(v);
  30. low[u]=min(low[u],low[v]);
  31. }
  32. else if(l[v])low[u]=min(low[u],dfn[v]);
  33. }
  34. if(dfn[u]==low[u])
  35. {
  36. cnt++;
  37. do
  38. {
  39. v=s[s[0]];
  40. l[v]=0;
  41. color[v]=cnt;
  42. s[0]--;
  43. }while(u!=v);
  44. }
  45. }
  46. void SPFA(int s)
  47. {
  48. int i,j,u,v,w,temp;
  49. queue<int> q;
  50. for(i=1;i<=n;i++)
  51. {
  52. l[i]=0;
  53. for(j=0;j<=100;j++)
  54. {
  55. f[j][i]=INF;
  56. }
  57. }
  58. for(j=0;j<=K;j++)f[j][s]=0;
  59. q.push(s);
  60. while(!q.empty())
  61. {
  62. u=q.front();
  63. q.pop();
  64. l[u]=0;
  65. for(i=0;i<G[u].size();i++)
  66. {
  67. v=G[u][i];
  68. w=C[u][i];
  69. if(color[u]!=color[v])
  70. {
  71. w=w<<1;
  72. for(j=0;j<=K;j++)
  73. {
  74. temp=f[j][u]+w;
  75. if(f[j+1][v]>temp)
  76. {
  77. f[j+1][v]=temp;
  78. if(!l[v])
  79. {
  80. l[v]=1;
  81. q.push(v);
  82. }
  83. }
  84. }
  85. }
  86. else
  87. {
  88. for(j=0;j<=K;j++)
  89. {
  90. temp=f[j][u]+w;
  91. if(f[j][v]>temp)
  92. {
  93. f[j][v]=temp;
  94. if(!l[v])
  95. {
  96. l[v]=1;
  97. q.push(v);
  98. }
  99. }
  100. }
  101. }
  102. }
  103. }
  104. }
  105. void work()
  106. {
  107. int i,ans=INF;
  108. SPFA(1);
  109. for(i=0;i<=K;i++)ans=min(ans,f[i][n]);
  110. //for(i=1;i<=n;i++)out<<color[i]<<endl;
  111. if(ans!=INF)out<<ans<<endl;
  112. else out<<-1<<endl;
  113. }
  114. void read()
  115. {
  116. int i,u,v,w;
  117. in>>n>>m>>K;
  118. for(i=1;i<=m;i++)
  119. {
  120. in>>u>>v>>w;
  121. u++;v++;
  122. G[u].push_back(v);
  123. C[u].push_back(w);
  124. }
  125. for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);
  126. }
  127. void clear()
  128. {
  129. int i,j;
  130. for(i=1;i<=100;i++)
  131. {
  132. G[i].clear();
  133. C[i].clear();
  134. for(j=0;j<=15;j++)
  135. {
  136. f[j][i]=0;
  137. }
  138. l[i]=0;
  139. dfn[i]=low[i]=0;
  140. tim=cnt=0;
  141. color[i]=0;
  142. }
  143. }
  144. int main()
  145. {
  146. while(true)
  147. {
  148. clear();
  149. read();
  150. if(!n)break;
  151. work();
  152. }
  153. return 0;
  154. }