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
求最短路,由于是完全图上删边,显然最短路不会太长,所以暴力的扫描即可。
#include<set> #include<map> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<bitset> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #define rep(i,j,k) for (int i = j; i <= k; i++) #define per(i,j,k) for (int i = j; i >= k; i--) #define loop(i,j,k) for (int i = j;i != -1; i = k[i]) #define lson x << 1, l, mid #define rson x << 1 | 1, mid + 1, r #define ff first #define ss second #define mp(i,j) make_pair(i,j) #define pb push_back #define pii pair<int,int> #define in(x) scanf("%d", &x); using namespace std; typedef long long LL; const int low(int x) { return x&-x; } const double eps = 1e-8; const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 2e5 + 10; int T, n, m, x ,y; int ft[N],nt[N],u[N],sz; int dis[N]; int main() { in(T); while (T--) { sz=0; scanf("%d%d",&n,&m); rep(i,1,n) dis[i]=-1,ft[i]=-1; rep(i,1,m) { scanf("%d%d",&x,&y); u[sz]=y; nt[sz]=ft[x]; ft[x]=sz++; u[sz]=x; nt[sz]=ft[y]; ft[y]=sz++; } scanf("%d",&x); dis[x]=0; int sum=n-1,t=0; while (sum) { ++t; int q=0; rep(i,1,n) { if (dis[i]!=-1) continue; int res=0,ans=0; loop(j,ft[i],nt) { if (dis[u[j]]!=-1&&dis[u[j]]<t) res++; } if (res+sum==n) continue; else {dis[i]=t; q++;} } sum-=q; if (!q) break; } int flag=0; rep(i,1,n) { if (dis[i]) { printf("%s%d",flag?" ":"",dis[i]); flag=1; } } putchar(10); } return 0; }