hdu2377Bus Pass(较为复杂的建图+spfa)

题目链接:

啊哈哈,点我点我

思路:

题目是给了很多个车站,然后要你找到一个社区距离这些车站的最大值最小。。所以对每个车站做一次spfa,那么就得到了到每个社区的最大值,最后对每个社区扫描一次,得到那个最大最小值。。还有题目要求是要最小的id,所以排一次序。

题目:

Bus Pass

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 667    Accepted Submission(s): 271

Problem Description

You travel a lot by bus and the costs of all the seperate tickets are starting to add up.

Therefore you want to see if it might be advantageous for you to buy a bus pass.

The way the bus system works in your country (and also in the Netherlands) is as follows:

when you buy a bus pass, you have to indicate a center zone and a star value. You are allowed to travel freely in any zone which has a distance to your center zone which is less than your star value. For example, if you have a star value of one, you can only
travel in your center zone. If you have a star value of two, you can also travel in all adjacent zones, et cetera.

You have a list of all bus trips you frequently make, and would like to determine the minimum star value you need to make all these trips using your buss pass. But this is not always an easy task. For example look at the following figure:

Here you want to be able to travel from A to B and from B to D. The best center zone is 7400, for which you only need a star value of 4. Note that you do not even visit this zone on your trips!

Input

On the first line an integert(1 <=t<= 100): the number of test cases. Then for each test case:

One line with two integersnz(2 <=nz<= 9 999) andnr(1 <=nr<= 10): the number of zones and the number of bus trips, respectively.

nz lines starting with two integers idi (1 <= idi <= 9 999) and mzi (1 <= mzi <= 10), a number identifying the i-th zone and the number of zones adjacent to it, followed by mzi integers: the numbers of
the adjacent zones.

nr lines starting with one integer mri (1 <= mri <= 20), indicating the number of zones the ith bus trip visits, followed by mri integers: the numbers of the zones through which the bus passes in the order in which they are
visited.

All zones are connected, either directly or via other zones.

Output

For each test case:

One line with two integers, the minimum star value and the id of a center zone which achieves this minimum star value. If there are multiple possibilities, choose the zone with the lowest number.

Sample Input

1
17 2
7400 6 7401 7402 7403 7404 7405 7406
7401 6 7412 7402 7400 7406 7410 7411
7402 5 7412 7403 7400 7401 7411
7403 6 7413 7414 7404 7400 7402 7412
7404 5 7403 7414 7415 7405 7400
7405 6 7404 7415 7407 7408 7406 7400
7406 7 7400 7405 7407 7408 7409 7410 7401
7407 4 7408 7406 7405 7415
7408 4 7409 7406 7405 7407
7409 3 7410 7406 7408
7410 4 7411 7401 7406 7409
7411 5 7416 7412 7402 7401 7410
7412 6 7416 7411 7401 7402 7403 7413
7413 3 7412 7403 7414
7414 3 7413 7403 7404
7415 3 7404 7405 7407
7416 2 7411 7412
5 7409 7408 7407 7405 7415
6 7415 7404 7414 7413 7412 7416

Sample Output

4 7400

Source

bapc2007

Recommend

lcy   |   We have carefully selected several similar problems for you:  2722 2363 2482 2962 1598 

代码为:

#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;

const int maxn=9999+10;
int dis[maxn],id[maxn],max_dis[maxn];
bool vis[maxn];
vector<int>vec[maxn];
int t,n,bus,cal;

bool cmp(int a,int b)
{
    return a<b;
}

void spfa(int st)
{
    queue<int>Q;
    while(!Q.empty())  Q.pop();
    memset(vis,false,sizeof(vis));
    memset(dis,INF,sizeof(dis));
    Q.push(st);
    dis[st]=0;
    vis[st]=true;
    while(!Q.empty())
    {
        int temp=Q.front();
        Q.pop();
        vis[temp]=false;
        for(int i=0;i<vec[temp].size();i++)
        {
            if(dis[temp]+1<dis[vec[temp][i]])
            {
                dis[vec[temp][i]]=dis[temp]+1;
                if(!vis[vec[temp][i]])
                {
                  vis[vec[temp][i]]=true;
                  Q.push(vec[temp][i]);
                }
            }
        }
    }
}

void read_graph()
{
    memset(max_dis,0,sizeof(max_dis));
    int u;
    scanf("%d%d",&n,&bus);
    for(int i=1;i<=maxn;i++)
        vec[i].clear();
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&id[i],&cal);
        for(int j=1;j<=cal;j++)
        {
            scanf("%d",&u);
            vec[id[i]].push_back(u);
        }
    }
    while(bus--)
    {
        scanf("%d",&cal);
        while(cal--)
        {
            int st;
            scanf("%d",&st);
            spfa(st);
            for(int i=1;i<=n;i++)
            {
                if(dis[id[i]]>max_dis[id[i]])
                    max_dis[id[i]]=dis[id[i]];
            }
        }
    }
    int ans=999999999,ans_id;
    sort(id+1,id+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        if(max_dis[id[i]]<ans)
        {
            ans=max_dis[id[i]];
            ans_id=id[i];
        }
    }
    printf("%d %d\n",ans+1,ans_id);
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        read_graph();
    }
    return 0;
}

hdu2377Bus Pass(较为复杂的建图+spfa),布布扣,bubuko.com

时间: 2024-08-08 09:36:40

hdu2377Bus Pass(较为复杂的建图+spfa)的相关文章

hdu2377Bus Pass(构建更复杂的图+spfa)

主题链接: 啊哈哈,点我点我 思路: 题目是给了非常多个车站.然后要你找到一个社区距离这些车站的最大值最小..所以对每一个车站做一次spfa.那么就得到了到每一个社区的最大值,最后对每一个社区扫描一次,得到那个最小值的社区.. 还有题目要求是要最小的id,所以排一次序. 题目: Bus Pass Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission

POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)

1 /* 2 bfs搜索!要注意的是点与点的权值是不一样的哦! 3 空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去) 4 所以用到优先队列进行对当前节点步数的更新! 5 */ 6 #include<iostream> 7 #include<queue> 8 #include<cstring> 9 #include<algorithm> 10 #include<cstdio> 11 using namespace std; 12 13

HDU1535Invitation Cards(有向图,正向建图和反向建图各spfa一次)

Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2374    Accepted Submission(s): 1151 Problem Description In the age of television, not many people attend theater performances.

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

HDU 2680 Choose the best route &lt;SPFA算法+反向建图&gt;

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10690    Accepted Submission(s): 3454 Problem Description One day , Kiki wants to visit one of her friends. As she is liabl

HDU 4370 0 or 1(spfa+思维建图+计算最小环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 题目大意:有一个n*n的矩阵Cij(1<=i,j<=n),要找到矩阵Xij(i<=1,j<=n)满足以下条件: 1.X 12+X 13+...X 1n=1  2.X 1n+X 2n+...X n-1n=1  3.for each i (1<i<n), satisfies ∑X ki (1<=k<=n)=∑X ij (1<=j<=n). 举个例子

HDU 3376--Matrix Again【最大费用最大流 &amp;&amp; 经典建图】

Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 3457    Accepted Submission(s): 1020 Problem Description Starvae very like play a number game in the n*n Matrix. A positive intege

HDU5669 Road 分层最短路+线段树建图

分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ?的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维护整个图, 连边时候找到对应区间,把线段树的节点之间连边.这样可以大大缩减边的规模,然后再跑分层图最短路就可以了. 但是这样建图,每一次加边都要在O(logn)个线段树节点上加边,虽然跑的非常快,但是复杂度仍然是不科学的. 为了解决边的规模的问题,开两棵线段树,连边时候可以新建一个中间节点,在对应区

hdu 5294 Tricks Device 最短路建图+最小割

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 375    Accepted Submission(s): 98 Problem Description Innocent Wu follows Dumb Zh