HDU 5876 补图最短路

雨点打透心脏的1/2处 2023-06-05 15:00 68阅读 0赞

题意:给一个图,和起点s,求s在补图中到各个点的最短路。

分析:补图最短路,算是比较套路的一类题了,bfs+两个set维护邻接点和未扩展的点。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inf 0x3f3f3f3f
  5. const int N = 1e6+5;
  6. int t,n,m,s,d[N];
  7. vector<int> g[N];
  8. void bfs() {
  9. queue<int> q;
  10. q.push(s);
  11. d[s] = 0;
  12. set<int> a,b;
  13. for(int i=1;i<=n;i++) a.insert(i);
  14. a.erase(s);
  15. while(!q.empty()) {
  16. int u = q.front(); q.pop();
  17. for(auto v:g[u]) {
  18. if(!a.count(v)) continue;
  19. b.insert(v);///未扩展的点
  20. a.erase(v);///邻接点
  21. }
  22. for(auto it:a) {
  23. d[it] = d[u] + 1;
  24. q.push(it);
  25. }
  26. a = b;
  27. b.clear();
  28. }
  29. int f=0;
  30. for(int i=1;i<=n;i++) {
  31. if(i==s) continue;
  32. if(d[i]==inf) d[i] = -1;
  33. if(f) printf(" %d",d[i]);
  34. else printf("%d",d[i]);
  35. f=1;
  36. }
  37. printf("\n");
  38. }
  39. int main(){
  40. while(~scanf("%d",&t)) {
  41. while(t--) {
  42. scanf("%d%d",&n,&m);
  43. for(int i=1;i<=n;i++) g[i].clear(),d[i]=inf;
  44. for(int i=1;i<=m;i++) {
  45. int u,v;
  46. scanf("%d%d",&u,&v);
  47. g[u].push_back(v);
  48. g[v].push_back(u);
  49. }
  50. scanf("%d",&s);
  51. bfs();
  52. }
  53. }
  54. return 0;
  55. }

发表评论

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

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

相关阅读

    相关 论-

    单源最短路: 单元最短路问题是固定一个起点,求它到其他所有点的最短路的问题。终点固定的问题也叫单源最短路。 算法1:Bellman-Ford算法 记从起点s出发到顶点i的

    相关 HDU - 5521 巧妙地

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