• HDU 5876 Sparse Graph(补图中求最短路)


    http://acm.hdu.edu.cn/showproblem.php?pid=5876

    题意:

    在补图中求s到其余各个点的最短路。

    思路:
    因为这道题目每条边的距离都是1,所以可以直接用bfs来做。

    处理的方法是开两个集合,一个存储当前顶点可以到达的点,另一个存储当前顶点不能到达的点。如果可以到达,那肯定由该顶点到达是最短的,如果不能,那就留着下一次再判。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<stack>
     7 #include<queue>
     8 #include<cmath>
     9 #include<map>
    10 #include<set>
    11 using namespace std;
    12 typedef long long ll;
    13 typedef pair<int,int> pll;
    14 const int INF = 0x3f3f3f3f;
    15 const int maxn=200000+5;
    16 
    17 int T;
    18 int n, m, s;
    19 int d[maxn];
    20 vector<int> G[maxn];
    21 
    22 void bfs()
    23 {
    24     queue<int> Q;
    25     Q.push(s);
    26     set<int> t1,t2;
    27     set<int>::iterator it;
    28     for(int i=1;i<=n;i++)  if(i!=s)  t1.insert(i);
    29     while(!Q.empty())
    30     {
    31         int u=Q.front(); Q.pop();
    32         for(int i=0;i<G[u].size();i++)
    33         {
    34             int v=G[u][i];
    35             if(!t1.count(v))  continue;
    36             t1.erase(v);  //删去u点不能到达的点
    37             t2.insert(v);  //将这些点放入t2中供下一次使用
    38         }
    39         for(it=t1.begin();it!=t1.end();it++)  //这些点都是u能到达的
    40         {
    41             d[*it]=d[u]+1;  
    42             Q.push(*it);
    43         }
    44         t1.swap(t2);  //t2中存储的是还没到达过的点
    45         t2.clear();
    46     }
    47     bool flag=true;
    48     for(int i=1;i<=n;i++)
    49     {
    50         if(i==s)  continue;
    51         if(!flag)  printf(" ");
    52         if(flag)   flag=false;
    53         if(d[i]==-1)  printf("-1");
    54         else printf("%d",d[i]);
    55     }
    56     printf("
    ");
    57 }
    58 
    59 int main()
    60 {
    61     //freopen("in.txt","r",stdin);
    62     int T;
    63     scanf("%d",&T);
    64     while(T--)
    65     {
    66         scanf("%d%d",&n,&m);
    67         for(int i=1;i<=n;i++)  G[i].clear();
    68         while(m--)
    69         {
    70             int u,v;
    71             scanf("%d%d",&u,&v);
    72             G[u].push_back(v);
    73             G[v].push_back(u);
    74         }
    75         scanf("%d",&s);
    76         memset(d,-1,sizeof(d));
    77         d[s]=0;
    78         bfs();
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    SpringMVC使用静态资源
    MyBatis学习系列三——结合Spring
    新生儿操作系统操作手册
    新生儿信息管理系统升级说明
    Installing Vim 8.0 on Ubuntu 16.04 and Linux Mint 18
    git push.default 几种设置笔记
    vue测试安装和配置
    rspec 笔记
    vue引入bootstrap和fontawesome
    Vue单文件模板实例
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7475903.html
Copyright © 2020-2023  润新知