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
12 01
Sample Output
1
Source
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<queue>
using namespace std;
const int maxm=2e4+100;
const int maxn=2e5+10;
const int inf=0x3f3f3f3f;
/*
思路真的是很强的,在我们的范围之内,但是要是想突破我们的固有思维
一看见最短路,脑子里就是各种模版,那真的是以前,交给我们模版,
到后来我们就没有模板了,怎样可以怎样来,大胆的猜想加上我们的验证
这就是我们要达到的高度,而且是必须达到的高度
*/
struct AE{
int cnt;
int head[maxn];
struct Edge{
int v,nt;
}edge[maxm*2];
void init(){
this->cnt=0;
memset(head,-1,sizeof(head));
}
void add_edge(int u,int v){
edge[cnt].nt=head[u];
edge[cnt].v=v;
head[u]=cnt++;
}
}ae;
int dis[maxn];
void bfs(int st,int n){
queue<int> q;
set<int> has_edge,no_edge;
for(int i=1;i<=n;i++){
dis[i]=inf;
if(i==st)continue;
no_edge.insert(i);
}
dis[st]=0;
q.push(st);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=ae.head[u];i!=-1;i=ae.edge[i].nt){
int v=ae.edge[i].v;
if(!no_edge.count(v))continue;
no_edge.erase(v);
has_edge.insert(v);
}
for(set<int>::iterator it=no_edge.begin();it!=no_edge.end();it++){
dis[*it]=dis[u]+1;
q.push(*it);
}
no_edge=has_edge;
has_edge.clear();
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
ae.init();
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d %d",&u,&v);
ae.add_edge(u,v);
ae.add_edge(v,u);
}
int st;
scanf("%d",&st);
bfs(st,n);
int flag=0;
for(int i=1;i<=n;i++){
if(i==st)continue;
if(!flag)
printf("%d",dis[i]==inf?-1:dis[i]);
else
printf(" %d",dis[i]==inf?-1:dis[i]);
flag++;
}
printf("\n");
}
return 0;
}