比赛 9.27练习赛 评测结果 AAAAAAAAAAAT
题目名称 观光 最终得分 92
用户昵称 袁书杰 运行时间 3.159 s
代码语言 C++ 内存使用 51.10 MiB
提交时间 2024-09-27 21:39:01
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. struct edge{
  5. int u,v,w,nxt;
  6. }e[1000005];
  7. int etot,head[1000005],dis[1000005],now,ans;
  8. bool vis[1000005],flag[1000005];
  9. void adde(int u,int v,int w){
  10. e[++etot]={u,v,w,head[u]};
  11. head[u]=etot;
  12. }
  13. struct node{
  14. int u,dis;
  15. bool operator<(const node&a)const{
  16. return a.dis<dis;
  17. }
  18. };
  19. priority_queue<node> q;
  20. void dij(int s){
  21. for(int i=0; i<=1000000; i++) {
  22. dis[i]=5e18;
  23. }
  24. q.push(node{s,0});
  25. dis[s]=0;
  26. while(!q.empty()){
  27. int u=q.top().u;
  28. q.pop();
  29. if(vis[u]){
  30. continue;
  31. }
  32. vis[u]=1;
  33. for(int i=head[u];i;i=e[i].nxt){
  34. int v=e[i].v,w=e[i].w;
  35. if(dis[v]>dis[u]+w){
  36. dis[v]=dis[u]+w;
  37. q.push(node{v,dis[v]});
  38. }
  39. }
  40. }
  41. }
  42. int n,m,s,t;
  43. void dfs(int u,int father,int len){
  44. if(u==t){
  45. if(len==now||len==now-1){
  46. ans++;
  47. return;
  48. }
  49. }
  50. if(len>now){
  51. return;
  52. }
  53. for(int i=head[u];i;i=e[i].nxt){
  54. int v=e[i].v;
  55. if(!flag[v]){
  56. flag[u]=true;
  57. dfs(v,u,len+e[i].w);
  58. flag[u]=false;
  59. }
  60. }
  61. }
  62. signed main(){
  63. freopen("sightseeing.in","r",stdin);
  64. freopen("sightseeing.out","w",stdout);
  65. ios::sync_with_stdio(false);
  66. cin.tie(0),cout.tie(0);
  67. int T;
  68. cin>>T;
  69. while(T--){
  70. cin>>n>>m;
  71. memset(vis,0,sizeof(vis));
  72. memset(flag,0,sizeof(flag));
  73. memset(head,0,sizeof(head));
  74. etot=0;
  75. now=0;
  76. ans=0;
  77. memset(e,0,sizeof(e));
  78. for(int i=1;i<=m;i++){
  79. int u,v,w;
  80. cin>>u>>v>>w;
  81. adde(u,v,w);
  82. }
  83. cin>>s>>t;
  84. dij(s);
  85. now=dis[t]+1;
  86. dfs(s,0,0);
  87. cout<<ans<<'\n';
  88. }
  89. return 0;
  90. }