比赛 4043级NOIP2022欢乐赛4th 评测结果 WWW
题目名称 路由选择问题 最终得分 0
用户昵称 ZRQ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-07 21:39:21
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=55,INF=0x3f3f3f3f;
  4. int n,st,ed;
  5. int w[N][N],dis[N][N],dis1[N][N],dis2[N][N];
  6. int p,t;
  7. bool vis[N];
  8. int main()
  9. {
  10. freopen("route.in","r",stdin);
  11. freopen("route.out","w",stdout);
  12. memset(dis,0x3f,sizeof(dis));
  13. memset(dis1,0x3f,sizeof(dis1));
  14. memset(dis2,0x3f,sizeof(dis2));
  15. int k;
  16. scanf("%d%d%d",&n,&st,&ed);
  17. for(int i=1;i<=n;++i)
  18. for(int j=1;j<=n;++j)
  19. scanf("%d",&k),w[i][j]=(k==0?INF:k);
  20. for(int i=1;i<=n;++i)
  21. for(int j=1;j<=n;++j)
  22. dis[i][j]=dis1[i][j]=dis2[i][j]=w[i][j];
  23. scanf("%d",&p);
  24. for(int i=1;i<=p;++i) scanf("%d",&t),vis[t]=1;
  25. for(int k=1;k<=n;++k)
  26. for(int i=1;i<=n;++i)
  27. for(int j=1;j<=n;++j)
  28. if(dis[i][j]>=dis[i][k]+dis[k][j])
  29. {
  30. dis1[i][j]=dis[i][j];
  31. dis[i][j]=dis[i][k]+dis[k][j];
  32. }
  33. for(int k=1;k<=n;++k)
  34. {
  35. if(vis[k]) continue;
  36. for(int i=1;i<=n;++i)
  37. {
  38. if(vis[i]) continue;
  39. for(int j=1;j<=n;++j)
  40. {
  41. if(vis[j]) continue;
  42. if(dis2[i][j]>dis2[i][k]+dis2[k][j])
  43. dis2[i][j]=dis2[i][k]+dis2[k][j];
  44. }
  45. }
  46. }
  47. printf("%d %d %d\n",dis2[st][ed],dis[st][ed],dis1[st][ed]);
  48. return 0;
  49. }