HDU 补图最短路

来源:互联网 发布:mysql 中间件 哪个好 编辑:程序博客网 时间:2024/06/07 10:33
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <queue>#include <vector>#include <set>using namespace std;const int maxn = 2e5 + 10;const int INF = 1e9 + 7;//vector <int> G[maxn];//bool vis[maxn] = {0};set <int> s1;set <int> s2;set <int> g[maxn];int d[maxn] = {0};int main () {    ios_base :: sync_with_stdio(false);    int t;    cin >> t;    while (t--) {        int n,m;        cin >> n >> m;        s1.clear();        s2.clear();        for (int i = 1;i <= n; ++ i) {//            G[i].clear();            g[i].clear();            d[i] = INF;            s2.insert (i);        }//        int ans = 0;        for (int i = 0;i < m; ++ i) {            int x,y;            cin >> x >> y;            g[x].insert(y);            g[y].insert(x);        }        int s;        cin >> s;        s2.erase(s);        s1.insert(s);        d[s] = 0;        queue<int> q;        while (!q.empty()) q.pop();        q.push(s);//        set <int> :: iterator it;        while (!q.empty()) {            int u = q.front();            q.pop();            for (int i = 1;i <= n; ++ i) {                if (s2.find(i) != s2.end() && g[u].find(i) == g[u].end()) {                    d[i] = min (d[i],d[u] + 1);                    q.push(i);                    s2.erase(i);                }            }            if (s2.size() == 0) break;        }        int i = 1;        for (;; ++ i) {            if (s != i) {                if (d[i] == INF) cout << -1;                else cout << d[i];                ++ i;                break;            }        }        for (;i <= n; ++ i) {            if (i == s) continue;            if (d[i] != INF)            cout << ' ' << d[i];            else {                cout << ' ' << -1;            }        }        cout << endl;    }    return 0;}

原创粉丝点击