HDU 5876 补图最短路

题意:给一个图,和起点s,求s在补图中到各个点的最短路。

分析:补图最短路,算是比较套路的一类题了,bfs+两个set维护邻接点和未扩展的点。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int N = 1e6+5;
int t,n,m,s,d[N];
vector<int> g[N];

void bfs() {
    queue<int> q;
    q.push(s);
    d[s] = 0;
    set<int> a,b;
    for(int i=1;i<=n;i++) a.insert(i);
    a.erase(s);
    while(!q.empty()) {
        int u = q.front(); q.pop();
        for(auto v:g[u]) {
            if(!a.count(v)) continue;
            b.insert(v);///未扩展的点
            a.erase(v);///邻接点
        }
        for(auto it:a) {
            d[it] = d[u] + 1;
            q.push(it);
        }
        a = b;
        b.clear();
    }
    int f=0;
    for(int i=1;i<=n;i++) {
        if(i==s) continue;
        if(d[i]==inf) d[i] = -1;
        if(f) printf(" %d",d[i]);
        else printf("%d",d[i]);
        f=1;
    }
    printf("\n");
}

int main(){
    while(~scanf("%d",&t)) {
        while(t--) {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++) g[i].clear(),d[i]=inf;
            for(int i=1;i<=m;i++) {
                int u,v;
                scanf("%d%d",&u,&v);
                g[u].push_back(v);
                g[v].push_back(u);
            }
            scanf("%d",&s);
            bfs();
        }
    }
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值