zju 1912(bfs)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1912

这道题思路就是从每个路线上点出发做bfs,求离所有路线点都尽可能近(及最大距离最小)的那个点作为中心。

但是有一个坑,

看这组数据:

2 1

7400 1 7401

7401 1 7400

1 7400

正确结果:1 7400

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
using namespace std;

typedef set<int>::iterator it;
const int N = 10000;
int dis[N], tdis[N], link[N][12];
queue<int> q;
set<int> zone;

void bfs(int o)
{
    memset(tdis, 0, sizeof(tdis));
    tdis[o] = 1;
    q.push(o);
    while(!q.empty())
    {
        int cur = q.front();  q.pop();
        if(tdis[cur]>dis[cur]) dis[cur]=tdis[cur];
        for(int i = 1; i <= link[cur][0]; ++i)
        {
            int j = link[cur][i];
            if(tdis[j]==0)  q.push(j), tdis[j] = tdis[cur] + 1;
        }
    }
}

int main()
{
    int cas, nz, nr, id, mz, mr, ans, t;
    scanf("%d", &cas);
    while(cas--)
    {
        zone.clear();
        memset(dis, 0, sizeof(dis));
        scanf("%d%d", &nz, &nr);
        for(int i = 1; i <= nz; ++i)
        {
            scanf("%d %d", &id, &mz);
            link[id][0] = mz;
            zone.insert(id);
            for(int i = 1; i <= mz; ++i)
                scanf("%d", &link[id][i]);
        }

        for(int i = 1; i <= nr; ++i)
        {
            scanf("%d", &mr);
            for(int j = 1; j <= mr; ++j)
            {
                scanf("%d", &t);
                bfs(t);
            }
        }
        it i = zone.begin();
        ans = *i;
        for(++i; i != zone.end(); ++i)
            if(dis[*i] < dis[ans]) ans = *i;
        printf("%d %d\n", dis[ans], ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值