Sparse Graph
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 83 Accepted Submission(s): 27
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题意:给一个无向图以及一个点s,求在其补图点 s 到其他n-1个点的最短距离解:利用原图求补图上的最短路,bfs遍历,U到 与U的不邻接的点的边即为补图的一条边,可以直接计算出 到这些不邻接的点距离,dis[v']=dis[u]+1;然后将这些不邻接的点加入队列,继续寻找,用两个集合,,一个记录不邻接的点,一个记录没有用过的点具体见代码:#include <iostream> #include <stdio.h> #include <queue> #include <string.h> #include <stdlib.h> #include <set> using namespace std; const int maxn=200000*5,inf=0x3f3f3f3f; struct Edge { int v,next,cap; } edge[maxn]; int tot,head[maxn]; int vis[maxn],du[maxn],dis[maxn]; void init() { tot=0; memset(head,-1,sizeof(head)); } void add_edge(int u,int v,int cap) { edge[tot].v=v; edge[tot].cap=cap; edge[tot].next=head[u]; head[u]=tot++; } void bfs(int start,int n) { set<int>s1; set<int>s2; set<int>::iterator it; for(int i=1;i<=n;i++) { if(i!=start) s1.insert(i); } queue<int>que; que.push(start); dis[start]=0; while(!que.empty()) { int u=que.front(); que.pop(); for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!s1.count(v)) continue; s1.erase(v); s2.insert(v); } for(it=s1.begin();it!=s1.end();it++) { que.push(*it); dis[*it]=dis[u]+1; } s1.swap(s2); s2.clear(); } } int main() { int s,n,t,m; int u,v; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); memset(du,0,sizeof(du)); for(int i=0; i<m; i++) { scanf("%d%d",&u,&v); add_edge(u,v,1); add_edge(v,u,1); } scanf("%d",&s); bfs(s,n); for(int i=1; i<=n; i++) { if(i==s) continue; if(dis[i]==inf) dis[i]=-1; printf("%d",dis[i]); if(i==n) printf("\n"); else printf(" "); } } return 0; }