Sparse Graph
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 110 Accepted Submission(s): 40
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
Recommend
每次扩展都选择与u无相邻的边。fb保存的是未扩展的。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
const int INF=0x7f7f7f;
const int N=2e5+10000;
struct edge
{
int next,v,w;
} edge[N];
int cnt,head[N];
long long dis[N];
void init()
{
memset(head,-1,sizeof(head));
memset(dis,INF,sizeof(dis));
cnt=0;
}
void add(int u,int v,int w)
{
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void bfs(int st,int ed)
{
queue<int>q;
q.push(st);
set<int>fa,fb;
int i;
dis[st]=0;
for(i=1; i<=ed; i++)
{
if(i!=st)
fa.insert(i);
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].v;
if(!fa.count(v))
continue;
fa.erase(v);
fb.insert(v);
}
for(set<int>:: iterator it=fa.begin(); it!=fa.end(); it++)
{
q.push(*it);
dis[*it]=dis[u]+1;
}
fa.swap(fb);
fb.clear();
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,s;
cin>>n>>m;
init();
for(int i=1; i<=m; i++)
{
int u,v;
cin>>u>>v;
add(u,v,1);
add(v,u,1);
}
cin>>s;
bfs(s,n);
int ok=0;
for(int i=1; i<=n; i++)
{
if(i==s)
continue;
if(ok)
cout<<" ";
ok=1;
if(dis[i]==INF)
cout<<-1;
else
cout<<dis[i];
}
cout<<endl;
}
return 0;
}