比赛 9.27练习赛 评测结果 AAAAAAAAAATT
题目名称 观光 最终得分 83
用户昵称 dream 运行时间 6.064 s
代码语言 C++ 内存使用 4.29 MiB
提交时间 2024-09-27 21:11:17
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> PI;
  4. const int N=20005,M=100005;
  5. int hd[N],to[M],nxt[M],val[M],dis[N],vis[N],tot;
  6. int t,n,m,sdis,s,f,ans;
  7. inline void read(int &x){
  8. char c;
  9. int sum=0,f=1;
  10. c=getchar();
  11. while(c<'0'||c>'9'){
  12. if(c=='-'){
  13. f=-1;
  14. }
  15. c=getchar();
  16. }
  17. while(c>='0'&&c<='9'){
  18. sum=sum*10+c-'0';
  19. c=getchar();
  20. }
  21. x=sum*f;
  22. }
  23. void add(int x,int y,int v){
  24. tot++;
  25. to[tot]=y;
  26. val[tot]=v;
  27. nxt[tot]=hd[x];
  28. hd[x]=tot;
  29. }
  30. void dijkstra(){
  31. memset(dis,0x3f,sizeof(dis));
  32. memset(vis,0,sizeof(vis));
  33. priority_queue<PI,vector<PI>,greater<PI> > q;
  34. q.push({0,s});
  35. dis[s]=0;
  36. while(!q.empty()){
  37. PI t=q.top();
  38. q.pop();
  39. if(vis[t.second]){
  40. continue;
  41. }
  42. vis[t.second]=1;
  43. for(int i=hd[t.second];i;i=nxt[i]){
  44. int y=to[i];
  45. if(dis[y]>dis[t.second]+val[i]){
  46. dis[y]=dis[t.second]+val[i];
  47. q.push({dis[y],y});
  48. }
  49. }
  50. }
  51. sdis=dis[f];
  52. }
  53. int mk[N];
  54. void dfs(int u,int sum){
  55. if(sum>sdis+1){
  56. return;
  57. }
  58. if(u==f){
  59. if(sum==sdis+1||sum==sdis){
  60. ans++;
  61. }
  62. return;
  63. }
  64. int flag=0;
  65. for(int i=hd[u];i;i=nxt[i]){
  66. int y=to[i];
  67. if(mk[y]){
  68. continue;
  69. }
  70. mk[y]=1;
  71. dfs(y,sum+val[i]);
  72. mk[y]=0;
  73. }
  74. }
  75. int main(){
  76. freopen("sightseeing.in","r",stdin);
  77. freopen("sightseeing.out","w",stdout);
  78. read(t);
  79. while(t--){
  80. ans=0;
  81. read(n);
  82. read(m);
  83. memset(hd,0,sizeof(hd));
  84. memset(nxt,0,sizeof(nxt));
  85. for(int i=1;i<=m;i++){
  86. int x,y,v;
  87. read(x);
  88. read(y);
  89. read(v);
  90. add(x,y,v);
  91. }
  92. read(s);
  93. read(f);
  94. dijkstra();
  95. // cout<<sdis<<"\n";
  96. dfs(s,0);
  97. printf("%d\n",ans);
  98. }
  99. return 0;
  100. }