HDU - 5521 巧妙地最短路

迷南。 2022-05-08 08:38 224阅读 0赞

题意:n个点,m块,块的意思就是说,在块中的点任意两点的距离都是t,问分别从1点和n点走到某个点,这个点的花费就是二者较大的,问这n个点花费最小是多少,并按字典序打印序号

思路:这题头疼的就是不知道怎么建图,暴力建图会超内存,有一个巧妙的方法是

将这个块中的点全部连到一个点上,每条边花费t/2,这样任意两点仍然是t的花费。

这样最多1e6条边

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e5+10;
  4. typedef long long ll;
  5. const ll INF=99999999999999999;
  6. struct node{
  7. int v;
  8. ll w;
  9. };
  10. vector<node> G[N];
  11. ll dis1[N], dis2[N], dis[N];
  12. int n, m;
  13. int ans[N], tot;
  14. bitset<N> inq;
  15. void spfa(int s, ll dd[]){
  16. for(int i=1; i<=n+m; i++) dd[i]=INF;
  17. inq.reset();
  18. dd[s]=0;
  19. queue<int> q; q.push(s); inq[s]=1;
  20. while(!q.empty()){
  21. int u=q.front(); q.pop();
  22. inq[u]=0;
  23. for(int i=0; i<G[u].size(); i++){
  24. int v=G[u][i].v;
  25. ll w=G[u][i].w;
  26. if(dd[v]>dd[u]+w){
  27. dd[v]=dd[u]+w;
  28. if(!inq[v]){
  29. inq[v]=1;
  30. q.push(v);
  31. }
  32. }
  33. }
  34. }
  35. }
  36. void init(){
  37. for(int i=1; i<=n+m; i++){
  38. G[i].clear();
  39. }
  40. }
  41. int main(){
  42. int T, cas=0;
  43. scanf("%d", &T);
  44. while(T--){
  45. scanf("%d%d", &n, &m);
  46. init();
  47. for(int i=1; i<=m; i++){
  48. int ti, si;
  49. scanf("%d%d", &ti, &si);
  50. for(int j=1; j<=si; j++){
  51. int p;
  52. scanf("%d", &p);
  53. G[n+i].push_back((node){p, ti});
  54. G[p].push_back((node){n+i, ti});
  55. }
  56. }
  57. spfa(1, dis1);
  58. spfa(n, dis2);
  59. ll mn=INF;
  60. for(int i=1; i<=n; i++){
  61. dis[i]=max(dis1[i], dis2[i]);
  62. mn=min(dis[i], mn);
  63. }
  64. printf("Case #%d: ", ++cas);
  65. if(mn==INF){
  66. printf("Evil John\n");
  67. continue;
  68. }
  69. printf("%lld\n", mn/2);
  70. tot=0;
  71. for(int i=1; i<=n; i++){
  72. if(mn==dis[i])
  73. ans[++tot]=i;
  74. // printf("%lld ", dis[i]);
  75. }
  76. // puts("");
  77. for(int i=1; i<=tot; i++){
  78. printf("%d", ans[i]);
  79. if(i==tot) putchar('\n');
  80. else putchar(' ');
  81. }
  82. }
  83. return 0;
  84. }

发表评论

表情:
评论列表 (有 0 条评论,224人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU - 5521 巧妙

    题意:n个点,m块,块的意思就是说,在块中的点任意两点的距离都是t,问分别从1点和n点走到某个点,这个点的花费就是二者较大的,问这n个点花费最小是多少,并按字典序打印序号 思