Sparse Graph---hdu5876(set+bfs)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5876

题意:有一个含有n个点的无向图,已知图的补图含有m条边u, v;求在原图中,起点s到其他n-1个点的最短距离,默认边的距离为1;

由于点的个数较大,不能建原图,只能从补图入手;从起点s开始,与s不直接相连的点的最短距离是1,然后再从这些点开始搜,循环即可,用队列表示,队列空了就结束了;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 400005
#define INF 0x3f3f3f3f
typedef long long LL;

vector<vector<int> >G;
int dist[N];

void bfs(int s, int n)
{
    set<int> s1, s2;
    for(int i=1; i<=n; i++)
    {
        if(i!=s) s1.insert(i);
        dist[i] = INF;
    }
    queue<int>Q;
    Q.push(s);
    dist[s] = 0;

    while(Q.size())
    {
        int p = Q.front();Q.pop();
        for(int i=0,len=G[p].size(); i<len; i++)
        {
            int q = G[p][i];
            if(s1.find(q) == s1.end())continue;///判断q点是否已经确定距离了;
            s1.erase(q);
            s2.insert(q);
        }
        set<int>::iterator it;
        for(it=s1.begin(); it!=s1.end(); it++)///那些到达不了的点都是可以由p点到达的;
        {
            dist[*it] = dist[p] + 1;
            Q.push(*it);
        }
        s1.swap(s2);///交换s2和s1;
        s2.clear();
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, m, start;
        scanf("%d %d", &n, &m);
        G.clear();
        G.resize(n+3);
        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", &start);
        bfs(start, n);
        int f = 0;
        for(int i=1; i<=n; i++)
        {
            if(i == start) continue;
            f++;
            if(dist[i] == INF) dist[i] = -1;
            printf("%d%c", dist[i], f == n-1?‘\n‘:‘ ‘);
        }
    }
    return 0;
}

时间: 2024-10-16 06:30:47

Sparse Graph---hdu5876(set+bfs)的相关文章

[ACM] hdu 1253 胜利大逃亡 (三维BFS)

胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出

UVA 657-The die is cast(双重BFS)

InterGames is a high-tech startup company that specializes in developing technology that allows users to play games over the Internet. A market analysis has alerted them to the fact that games of chance are pretty popular among their potential custom

POJ 3083:Children of the Candy Corn(DFS+BFS)

Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: 4039 Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and must wander through the maze facing zombies, ch

HDU1240-题目意思详解( 三维BFS)

题目大意:先输入START N 表示这个立方体的层数是N,每一层为一个NxN的正方形..其实就是一个NxNxN的正方体,输入时一层一层的输入. 输入完立方体后,输入起点和终点的坐标. 输出是 先输出 N 再输出最短路径的步数.如果走不到终点,输出NO ROUTE. 坑点:它输入的起点和终点坐标不与我们输入的立方体对应. #include <cstdio> #include <cstring> #include <iostream> #include <queue&

hdu 2102 A计划(双层BFS)(详解)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她

POJ 2049— Finding Nemo(三维BFS)10/200

海底总动员.... 这个题开始不会建图,彻底颠覆以前我对广搜题的想法.想了好久, 忽然想到省赛时HYPO让我做三维BFS来着,一直没做,看到POJ计划这个题,就是三维BFS解题,就做了一下, 对于这个题....实在不知道说什么好,又坑.又SB,POJ的后台数据和题目描述的完全不一样,看了DIscuss之后开始 改动代码,最后改的又臭又长,搜了无数题解找数据,卡了整整两天. 挥挥洒洒 160行....同时也是我第一次使用  三维建图+BFS,纪念一下! 2049 算是我攻克POJ计划的第一个卡两天

HDU 1240——Asteroids!(三维BFS)POJ 2225——Asteroids

普通的三维广搜,需要注意的是输入:列,行,层 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define M 11 using namespace std; int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//6个方向 int

hdu 2102 A计划(双层BFS)(具体解释)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,由于他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来解救公主.只是公主早已习以为常,她

POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 2)再输出右转优先时,从S到E的步数 3)最后输出S到E的最短步数 解题思路: 前两问DFS,转向只要控制一下旋转方向就可以 首先设置前进方向对应的数字 向上--N--0 向右--E--1 向下--S--2 向左--W--3 比如说右转优先,即为向右,向前,向左,向后,即逆时针方向for(int i

图像分割之(二)Graph Cut(图割)

[email protected] http://blog.csdn.net/zouxy09 上一文对主要的分割方法做了一个概述.那下面我们对其中几个比较感兴趣的算法做个学习.下面主要是Graph Cut,下一个博文我们再学习下Grab Cut,两者都是基于图论的分割方法.另外OpenCV实现了Grab Cut,具体的源码解读见博文更新.接触时间有限,若有错误,还望各位前辈指正,谢谢. Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image se