记录编号 250800 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 正则表达式 最终得分 100
用户昵称 GravatarSatoshi 是否通过 通过
代码语言 C++ 运行时间 2.298 s
提交时间 2016-04-15 22:18:43 内存使用 15.81 MiB
显示代码纯文本
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <stack>
  5. #include <queue>
  6. #include <map>
  7. #include <cstring>
  8. #define N 211110
  9. using namespace std;
  10. ifstream in("regexp.in");
  11. ofstream out("regexp.out");
  12. int n,m;
  13. int INF=(1<<28);
  14. vector<int> F[N],B[N],G[N],C[N];
  15. bool l[N]={0};
  16. vector<int> scc[N];
  17. int dfn[N]={0},low[N]={0};
  18. int color[N]={0};
  19. int col=0,tim=0;
  20. int f[N]={0};
  21. stack<int> S;
  22. void tarjan(int u)
  23. {
  24. dfn[u]=low[u]=++tim;
  25. l[u]=1;
  26. S.push(u);
  27. int i,v;
  28. for(i=0;i<G[u].size();i++)
  29. {
  30. v=G[u][i];
  31. if(!dfn[v])
  32. {
  33. //out<<u<<' '<<v<<endl;
  34. tarjan(v);
  35. low[u]=min(low[u],low[v]);
  36. }
  37. else if(l[v])low[u]=min(low[u],dfn[v]);
  38. }
  39. if(dfn[u]==low[u])
  40. {
  41. col++;
  42. do
  43. {
  44. v=S.top();
  45. S.pop();
  46. l[v]=0;
  47. scc[col].push_back(v);
  48. color[v]=col;
  49. }while(u!=v);
  50. }
  51. }
  52. void Dijkstra(int s)
  53. {
  54. priority_queue <pair<int,int> > q;
  55. int i,u,v,w;
  56. memset(l,0,sizeof(l));
  57. for(i=1;i<=n;i++)f[i]=INF;
  58. f[s]=0;
  59. q.push(make_pair(-f[s],s));
  60. while(!q.empty())
  61. {
  62. u=q.top().second;
  63. q.pop();
  64. l[u]=0;
  65. for(i=0;i<F[u].size();i++)
  66. {
  67. v=F[u][i];
  68. w=B[u][i];
  69. if(f[v]>f[u]+w)
  70. {
  71. f[v]=f[u]+w;
  72. if(!l[v])
  73. {
  74. l[v]=1;
  75. q.push(make_pair(-f[v],v));
  76. }
  77. }
  78. }
  79. }
  80. }
  81. void SCC()
  82. {
  83. int i;
  84. for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);
  85. /*for(i=1;i<=n;i++)out<<color[i]<<' ';
  86. out<<endl;*/
  87. }
  88. void add(int u,int v,int w)
  89. {
  90. F[u].push_back(v);
  91. B[u].push_back(w);
  92. }
  93. void rebuild()
  94. {
  95. int i,j,u,v;
  96. //map<int,pair<int,int> > F;
  97. for(i=1;i<=n;i++)
  98. {
  99. //u=color[i];
  100. for(j=0;j<G[i].size();j++)
  101. {
  102. v=G[i][j];
  103. //v=color[G[i][j]];
  104. //out<<color[i]<<' '<<color[v]<<endl;
  105. if(color[i]!=color[v])
  106. {
  107. add(color[i],color[v],C[i][j]);
  108. }
  109. }
  110. }
  111. }
  112. void read()
  113. {
  114. int i,u,v,w;
  115. in>>n>>m;
  116. for(i=1;i<=m;i++)
  117. {
  118. in>>u>>v>>w;
  119. G[u].push_back(v);
  120. C[u].push_back(w);
  121. }
  122. }
  123. void work()
  124. {
  125. SCC();
  126. rebuild();
  127. Dijkstra(color[1]);
  128. out<<f[color[n]]<<endl;
  129. }
  130. int main()
  131. {
  132. int __size__ = 20 << 20; // 20MB
  133. char *__p__ = (char*)malloc(__size__) + __size__;
  134. __asm__("movl %0, %%esp\n" :: "r"(__p__));
  135. read();
  136. work();
  137. return 0;
  138. }