hdu5876 Sparse Graph

来源:互联网 发布:天猫国际官方直营知乎 编辑:程序博客网 时间:2024/05/16 09:02

题意:给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;}


0 0
原创粉丝点击