思路:一个很经典的题目,求补图的最短路,方法是建原图,然后用两个set维护还没 BFS 过的点。当要扩展点 u 的时候,遍历一次还没访问过的点 v,如果 uv 没边,那么将 v 入队。否则将 v 留在未扩展点中。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000+7;
vector<int>e[maxn];
int n,m,s,dis[maxn];
set<int>v1,v2;
set<int>::iterator it;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i = 0;i<=n;i++)e[i].clear();
memset(dis,-1,sizeof(dis));
v1.clear();
v2.clear();
for(int i = 1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i = 1;i<=n;i++)
v1.insert(i);
scanf("%d",&s);
queue<int>q;
q.push(s);
dis[s]=0;
v1.erase(s);
while(!q.empty())
{
int u = q.front();q.pop();
for(int i = 0;i<e[u].size();i++)
{
int v = e[u][i];
if(!v1.count(v))
continue;
v1.erase(v);
v2.insert(v);
}
for(it = v1.begin();it!=v1.end();it++)
{
q.push(*it);
dis[*it]=dis[u]+1;
}
v1.swap(v2);
v2.clear();
}
for(int i = 1;i<=n;i++)
{
if(i==s)continue;
printf("%d%c",dis[i],i==n?'\n':' ');
}
}
}
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
not
adjacent 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 N−1 other vertices.
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 N−1 other vertices.
Input
There are multiple test cases. The first line of input is an integer
T(1≤T<35)
denoting the number of test cases. For each test case, the first line contains two integers
N(2≤N≤200000)
and
M(0≤M≤20000)
. The following
M
lines each contains two distinct integers
u,v(1≤u,v≤N)
denoting an edge. And
S (1≤S≤N)
is given on the last line.
Output
For each of
T
test cases, print a single line consisting of
N−1
space separated integers, denoting shortest distances of the remaining
N−1
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
Source