大连网赛 1009 HDU5876 稠密图的最短路

来源:互联网 发布:一级msoffice模拟软件 编辑:程序博客网 时间:2024/05/16 06:04
#include<cstdio>#include<vector>#include<queue>#include<set>using namespace std;const int maxn=200010;int n,m,s,u,v;int d[maxn];set<int>::iterator it;set<int> t1,t2;vector<int> G[maxn];void bfs(int s){    queue<int> q;    t1.clear(),t2.clear();    for(int i=1;i<=n;i++) if(i!=s) t1.insert(i);    q.push(s);    d[s]=0;    while(!q.empty())    {        int u=q.front();q.pop();        for(int i=0;i<G[u].size();i++)        {            int v=G[u][i];            if(!t1.count(v)) continue;            t1.erase(v),t2.insert(v);        }        for(it=t1.begin();it!=t1.end();it++)        {            q.push(*it);            d[*it]=d[u]+1;        }        t1.swap(t2);        t2.clear();    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<maxn;i++) G[i].clear();        for(int i=0;i<m;i++)        {            scanf("%d%d",&u,&v);            G[u].push_back(v);            G[v].push_back(u);        }        scanf("%d",&s);        bfs(s);        int flag=0;        for(int i=1;i<=n;i++)        {            if(i==s) continue;            if(flag) printf(" ");            flag=1;            if(!d[i]) printf("-1");            else printf("%d",d[i]);        }        puts("");    }    return 0;}


0 0
原创粉丝点击