您的位置:首页 > 其它

HDU 5876 补图求最短路

2016-09-10 20:15 399 查看

Sparse Graph

[b]Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

Total Submission(s): 110    Accepted Submission(s): 40
[/b]

[align=left]Problem Description[/align]
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.
 

[align=left]Input[/align]
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.
 

[align=left]Output[/align]
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.
 

[align=left]Sample Input[/align]

1
2 0
1

 

[align=left]Sample Output[/align]

1

 

[align=left]Source[/align]
2016 ACM/ICPC Asia Regional Dalian Online

 

[align=left]Recommend[/align]
wange2014   |   We have carefully selected several similar problems for you:  5877 5875 5874 5873 5872 
 

每次扩展都选择与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
;
int cnt,head
;
long long dis
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM算法
相关文章推荐