Sparse Graph
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 617 Accepted Submission(s): 210
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.
<span style="font-size:18px;"> #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<queue>
using namespace std;
const int maxn=200010;
vector<int> v[maxn];
int n,m,dis[maxn],s;
void BFS()
{
set<int> s1,s2;
set<int>::iterator it;
queue<int> que;
que.push(s);
dis[s]=0;
for(int i=1;i<=n;i++)
if(i!=s) s1.insert(i);
while(!que.empty())
{
int u=que.front();
que.pop();
int len=v[u].size();
for(int i=0;i<len;i++)
{
int vv=v[u][i];
if(!s1.count(vv))
continue;
s1.erase(vv);
s2.insert(vv);
}
for(it=s1.begin();it!=s1.end();it++)
{
que.push(*it);
dis[*it]=dis[u]+1;
}
s1.swap(s2);
s2.clear();
}
}
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
memset(dis,0x3f,sizeof(dis));
for(int i=0;i<maxn;i++) v[i].clear();
for(int i=0;i<m;i++)
{
scanf("%d %d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
scanf("%d",&s);
BFS();
for(int i=1;i<=n;i++)
{
if(i==s){
if(i==n) printf("\n");
continue;
}
printf("%d%c",dis[i],i==n? '\n' : ' ');
}
}
return 0;
}
</span>