大連網賽 1009 HDU5876 稠密圖的最短路

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章