zoukankan      html  css  js  c++  java
  • HDU 5876 Sparse Graph BFS 最短路

    Sparse Graph




    Problem Description
     
    In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if and only if they are notadjacent in G

    Now you are given an undirected graph G of N nodes and M bidirectional edges of unit length. Consider the complement of G, i.e., H. For a given vertex S on H, you are required to compute the shortest distances from S to all N1 other vertices.
     

    Input

    There are multiple test cases. The first line of input is an integer T(1T<35) denoting the number of test cases. For each test case, the first line contains two integers N(2N200000) and M(0M20000). The following M lines each contains two distinct integers u,v(1u,vN) denoting an edge. And S (1SN) is given on the last line.
     
    Output
     
    For each of T test cases, print a single line consisting of N1 space separated integers, denoting shortest distances of the remaining N1 vertices from S (if a vertex cannot be reached from S, output ``-1" (without quotes) instead) in ascending order of vertex number.
     
    Sample Input
     
    1 2 0 1
     
    Sample Output
     
    1
     
     
    题意:
      
      n 个点的无向完全图中删除 m 条边,问点 s 到其他点的最短路长度。
     
    题解:
      
      
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<set>
    using namespace std;
    
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define ls i<<1
    #define rs ls | 1
    #define mid ((ll+rr)>>1)
    #define pii pair<int,int>
    #define MP make_pair
    
    typedef long long LL;
    const long long INF = 1e18;
    const double Pi = acos(-1.0);
    const int N = 2e5+10, M = 1e2+11, mod = 1e9+7, inf = 2e9;
    
     int T,n,m,vis[N],head[N],t,d[N],ans[N];
     struct ss{int to,next;}e[N * 2];
     void add(int u,int v) {e[t].to=v;e[t].next=head[u];head[u]=t++;}
    
    int main() {
            scanf("%d",&T);
            while(T--) {
                scanf("%d%d",&n,&m);
                t =1;memset(head,0,sizeof(head));
                for(int i = 1; i <= m; ++i) {
                    int a,b;
                    scanf("%d%d",&a,&b);
                    add(a,b);add(b,a);
                }
                memset(vis,0,sizeof(vis));
                memset(d,-1,sizeof(d));
                int S;
                scanf("%d",&S);
                queue<int > q;
                q.push(S);vis[S] = 1;
                d[S] = 0;
                set<int > s;
                for(int i = 1; i <= n; ++i) if(i != S) s.insert(i),vis[i] = 1;
                while(!q.empty()) {
                    int k = q.front();
                    q.pop();
                    for(int i = head[k]; i; i =e[i].next) {
                        int to = e[i].to;
                        if(s.count(to)) {
                            vis[to] = 0;
                        }
                    }
                    for(set<int > ::iterator itt,it = s.begin();it != s.end(); ) {
                        if(vis[*it])
                        {
                            d[*it] = d[k] + 1;
                            q.push(*it);
                            itt = it;
                            itt++;
                            s.erase(it);
                            it = itt;
                        } else {
                            it++;
                        }
                    }
                    for(set<int > ::iterator itt,it = s.begin();it != s.end(); it++) vis[*it] = 1;
                }
                 int cnt = 0;
                for(int i = 1; i <= n; ++i) {
                        if(i != S)ans[++cnt] = d[i];
                }
                for(int i = 1; i < cnt; ++i) printf("%d ",ans[i]);
                printf("%d
    ",ans[cnt]);
            }
            return 0;
    }
  • 相关阅读:
    反Secure Boot垄断:兼谈如何在Windows 8电脑上安装Linux
    火车售票系统(数据结构课设)
    货物管理系统(数据结构链式表)
    货物管理系统(数据结构顺序表)
    进制转换器(十进制转n进制)
    大学生成绩管理系统(C语言)
    如何对Linux的grub进行加密
    戴文的Linux内核专题:07内核配置(3)
    戴文的Linux内核专题:06配置内核(2)
    戴文的Linux内核专题:05配置内核(1)
  • 原文地址:https://www.cnblogs.com/zxhl/p/5869691.html
Copyright © 2011-2022 走看看