• HDU 5876 补图最短路


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

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int INF = 0x3f3f3f3f;
    const int maxn=200000+5;
    
    int T;
    int n, m, s;
    int d[maxn];
    vector<int> G[maxn];
    
    void bfs()
    {
        queue<int> Q;
        Q.push(s);
        set<int> t1,t2;
        set<int>::iterator it;
        for(int i=1;i<=n;i++)  if(i!=s)  t1.insert(i);
        while(!Q.empty())
        {
            int u=Q.front(); Q.pop();
            for(int i=0;i<G[u].size();i++)
            {
                int v=G[u][i];
                if(!t1.count(v))  continue;
                t1.erase(v);  //删去u点不能到达的点
                t2.insert(v);  //将这些点放入t2中供下一次使用
            }
            for(it=t1.begin();it!=t1.end();it++)  //这些点都是u能到达的
            {
                d[*it]=d[u]+1;  
                Q.push(*it);
            }
            t1.swap(t2);  //t2中存储的是还没到达过的点
            t2.clear();
        }
        bool flag=true;
        for(int i=1;i<=n;i++)
        {
            if(i==s)  continue;
            if(!flag)  printf(" ");
            if(flag)   flag=false;
            if(d[i]==-1)  printf("-1");
            else printf("%d",d[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)  G[i].clear();
            while(m--)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                G[u].push_back(v);
                G[v].push_back(u);
            }
            scanf("%d",&s);
            memset(d,-1,sizeof(d));
            d[s]=0;
            bfs();
        }
        return 0;
    }
  • 相关阅读:
    开发中的问题
    页面重定向Redirect时产生错误
    项目管理的几个阶段及分工
    让你的CSS像Jquery一样做筛选
    项目中的几个SQL程序
    SharePoint2010人员搜索配置心得
    TroubleShoot:该搜索请求无法连接到搜索服务
    转:软件架构师应该知道的97件事
    通用动态生成静态HTML页方法
    简单的正则表达式过滤网址
  • 原文地址:https://www.cnblogs.com/Aragaki/p/11311234.html
Copyright © 2020-2023  润新知