加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

HDU 3832 Earth Hour Multi-University_Training_Contest Host_By_HNU

(2011-07-13 11:28:36)
标签:

hdu

3832

earth

hour

最短路

it

分类: 图论
题目描述:
模型为:告诉你n个点,和一些无向边,问你最多能够删掉多少个点,保证1,2,3号点是互相可达的。
解题报告:
无向边的边权设置为1,用3遍spfa或者什么,求出3个数组d[3][n],d[i][j]表示i(1 <= i <= 3)到n的最短路。
枚举点i,找一个d[0][i] + d[1][i] + d[2][i] + 1最小的值,这个就是能够剩下的最少的点。用n减去之就是答案。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int g[200][200];
struct pint
{
    double x, y, r;
}jeo[200];
int t, n ,que[100000], d1[200], d2[200], d3[200], vst[200];
void spfa(int d[], int st)
{

    memset(vst, 0, sizeof(vst));
    vst[st] = 1;
    int head = 0, tail = 0, tmp;
    d[st] = 0;
    que[tail++] = st;
    while(head < tail)
    {
        vst[que[head]] = 0;
        for(int i = 0; i < n; i++)
            if (g[que[head]][i] != -1 && (d[i] == -1 || d[que[head]] + 1 < d[i]))
            {
                d[i] = d[que[head]] + 1;
                if (!vst[i])
                {
                    vst[i] = 1;
                    que[tail++] = i;
                }
            }
        head++;
    }
}
int main()
{
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        memset(g, -1, sizeof(g));
        for(int i = 0; i < n; i++)
            scanf("%lf%lf%lf", &jeo[i].x, &jeo[i].y, &jeo[i].r);
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                if (i != j)
                {
                    double dis = sqrt((jeo[i].x - jeo[j].x) * (jeo[i].x - jeo[j].x) + (jeo[i].y - jeo[j].y) * (jeo[i].y - jeo[j].y));
                    if (dis - jeo[i].r - jeo[j].r <= 0)
                        g[i][j] = 1;
                }
        memset(d1, -1, sizeof(d1));
        memset(d2, -1, sizeof(d2));
        memset(d3, -1, sizeof(d3));
        spfa(d1, 0); spfa(d2, 1); spfa(d3, 2);
        int ans = -1;
        for(int i = 0; i < n; i++)
            if (d1[i] != -1 && d2[i] != -1 && d3[i] != -1)
            {
                int tmp = d1[i] + d2[i] + d3[i];
                if (ans == -1 || tmp < ans) ans = tmp;
            }
        if (ans == -1) printf("-1\n");
        else printf("%d\n", n - ans - 1);
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有