记录编号 559285 评测结果 AWAWWWWWWW
题目名称 [SYOI 2019][東方S#]河童与灵力 最终得分 20
用户昵称 Gravatartat 是否通过 未通过
代码语言 C++ 运行时间 0.781 s
提交时间 2021-02-27 11:35:19 内存使用 8.22 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. //第一问求强连通分量个数 第二问缩点后最短路 建陆方式 =》顺向花费0 逆向有花费 然后dj
  4. long long n,m,ed[50001][4],dfn[50001]={0},low[50001],t=0,ext[50001],num=0,bt[50001]={0};
  5. vector<long long> ed1[50001];
  6. stack<long long> stk;
  7. //4,5,6行是求强连通分量
  8. struct edge{
  9. long long sp,cost;
  10. };
  11. vector<edge> ed2[50001];
  12. struct dist{
  13. long long x,data;
  14. bool operator < (const dist &tmp)const{
  15. return this->data>tmp.data;
  16. }
  17. dist() :x(),data(){}
  18. dist(long long a,long long b): x(a),data(b){}
  19. };
  20. priority_queue<dist> dj;
  21. long long d[50001],st,v[50001],node[50001]={0},spell[50001]={0};
  22. //8~21行是“缩点之后 ”求最短路
  23. void dfs(long long x){
  24. dfn[x]=low[x]=++t;
  25. ext[x]=1;
  26. stk.push(x); //第一次访问时入栈
  27. for(long long i=0;i<ed1[x].size();i++){
  28. long long to=ed1[x][i];
  29. if(!dfn[to]){
  30. dfs(to);
  31. low[x]=min(low[to],low[x]);
  32. }
  33. else if(ext[to]){
  34. //想想看:如果从y没有到x的路径,那么y早就应该出栈了
  35. low[x]=min(low[x],dfn[to]);
  36. }
  37. }
  38. if(low[x]==dfn[x]){
  39. num++;
  40. long long y=0;
  41. do{
  42. y=stk.top();
  43. stk.pop();
  44. ext[y]=0;
  45. bt[y]=num;
  46. spell[num]+=node[y];
  47. }while(y!=x);
  48. }
  49. }
  50. int main(int argc, char** argv) {
  51. freopen("EAST.in","r",stdin);
  52. freopen("EAST.out","w",stdout);
  53. cin>>n>>m>>st;
  54. for(long long i=1;i<=m;i++){
  55. cin>>ed[i][1]>>ed[i][2]>>ed[i][3];
  56. long long a=ed[i][1],b=ed[i][2];
  57. ed1[a].push_back(b);
  58. }
  59. for(long long i=1;i<=n;i++){
  60. cin>>node[i];
  61. }
  62. for(long long i=1;i<=n;i++){
  63. if(!dfn[i])dfs(i);
  64. }
  65. cout<<num<<endl;
  66. //问题1
  67. for(long long i=1;i<=m;i++){
  68. long long a=ed[i][1],b=ed[i][2],c=ed[i][3];
  69. if(bt[a]!=bt[b]){
  70. edge x,y;// x是正向边,y是逆向边
  71. y.sp=a;
  72. x.sp=b;
  73. y.cost=c;
  74. x.cost=0;
  75. ed2[a].push_back(x);
  76. ed2[b].push_back(y);
  77. }
  78. }
  79. //建新图
  80. memset(d,0x3f,sizeof(d));
  81. d[st]=0;
  82. dj.push(dist(st,0));
  83. while(!dj.empty()){
  84. long long z=dj.top().x,y=dj.top().data;
  85. dj.pop();
  86. if(v[z])continue;
  87. v[z]=1;
  88. for(long long i=0;i<ed2[z].size();i++){
  89. long long to=ed2[z][i].sp,c=ed2[z][i].cost;
  90. //cout<<to<<' '<<c<<' '<<d[to]<<endl;
  91. if(d[to]>d[z]+c){
  92. d[to]=d[z]+c;
  93. dj.push(dist(to,d[to]));
  94. }
  95. }
  96. }
  97. //dj
  98. long long ans=0;
  99. for(long long i=1;i<=num;i++){
  100. if(v[i]){
  101. ans-=d[i];
  102. ans+=spell[i];
  103. //cout<<spell[i]<<' '<<d[i]<<endl;
  104. }
  105. }
  106. cout<<ans;
  107. return 0;
  108. }