您的位置:首页 > 其它

hdu5876 Sparse Graph

2016-09-12 20:12 351 查看
题意:给2e6的点,2e5的边,求补图中,单源点到所有点的最短路

题解:比赛时候,没有仔细考虑这个,发现其实挺水的

            边少的,一半是用bfs

            维护两个set,set1中,记录的是,没有处理的点,set2中是刚刚处理的点

            经过一个点时,把连接的点,且在set1中的点,放到set2中,然后set1中的点就可以处理,交换set1和set2

             时间复杂度O(m+n)(比赛时候错误的估计了复杂度。。)

queue <int> q;
set <int> s;
set <int> s1;
int ans[200010];
set <int> ss[200010];

int main(){
int t;
cin>>t;
while(t--){
while(!q.empty())
q.pop();
s.clear();
for(int i=0;i<200002;i++)
ss[i].clear();
int n,m;
scanf("%d %d",&n,&m);
int x,y;
for(int i=0;i<m;i++){
scanf("%d %d",&x,&y);
ss[x].insert(y);
ss[y].insert(x);
}
int beg=0;
cin>>beg;
for(int i=1;i<=n;i++){
if(i!=beg){
s.insert(i);
}
}
memset(ans,-1,sizeof(ans));
ans[beg]=0;
q.push(beg);
while(!q.empty()){
int xx=q.front();
q.pop();
for(set <int>::iterator it=ss[xx].begin();it!=ss[xx].end();it++){
if(s.count(*it)!=0){
s.erase(*it);
s1.insert(*it);
}
}
for(set <int>::iterator it=s.begin();it!=s.end();it++){
ans[*it]=ans[xx]+1;
q.push(*it);
}
s.swap(s1);
s1.clear();
}
bool bool1=true;
for(int i=1;i<=n;i++){
if(i!=beg){
if(bool1){
bool1=false;
printf("%d",ans[i]);
}
else {
printf(" %d",ans[i]);
}
}
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: