2021年度训练联盟热身训练赛第一场 H题On Average They‘re Purple(BFS)

题意:

给你一些联通关系,问Bob先选择一些路径(1~n)联通,Alice在路径上染色,Bob的目的是选择一些路径使得染色变化最小,对于Alice来说,需要使得在Bob选择的( 1 − n 1-n 1n)d的路径上使得颜色变化最大。

题目:

在这里插入图片描述

Alice and Bob are playing a game on a simple connected graph with N nodes and M edges.
Alice colors each edge in the graph red or blue.
A path is a sequence of edges where each pair of consecutive edges have a node in common. If the first edge in the pair is of a different color than the second edge, then that is a ‘‘color change.’’
After Alice colors the graph, Bob chooses a path that begins at node 1 and ends at node N. He can choose any path on the graph, but he wants to minimize the number of color changes in the path. Alice wants to choose an edge coloring to maximize the number of color changes Bob must make. What is the maximum number of color changes she can force Bob to make, regardless of which path he chooses? changes she can force Bob to make, regardless of which path he chooses?

输入描述:

The first line contains two integer values N and M with 2 ≤ N ≤ 100000 2≤N≤100000 2N100000 and 1 ≤ M ≤ 100000 1≤M≤100000 1M100000. The next M lines contain two integers a i a_{i} aiand b i b_{i} bi indicating an undirected edge between nodes a i a_{i} ai and b i b_{i} bi ( 1 ≤ a i , b i ≤ N , a i ≠ b i ) 1≤a_{i},b_{i} ≤N, a_{i}\neq b_{i}) 1ai,biN,ai=bi)All edges in the graph are unique.

输出描述:

Output the maximum number of color changes Alice can force Bob to make on his route from node 1 to node N.

示例1
输入

3 3
1 3
1 2
2 3

输出

0

示例2
输入

7 8
1 2
1 3
2 4
3 4
4 5
4 6
5 7
6 7

输出

3

分析:

为了使得染色变化最小,那么就选择1~n最短路径即可,因为是无权路径,且题目是求染色变化,可以用BFS在一个无权图上求从起点到其他所有点的最短路径。最大染色变化即为最短路径长-1;

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
const int M=1e5+10;
using namespace std;
bool vis[M];
int n,m,dist[M];
vector<int>g[M];
void BFS()
{
    queue<int>q;
    q.push(1);
    vis[1]=1;
    dist[1]=0;
    while(!q.empty())
    {
        int i=q.front();
        q.pop();
        for(int k=0; k<g[i].size(); k++)
        {
            int j=g[i][k];
            if(vis[j])
                continue;
            vis[j]=1;
            dist[j]=dist[i]+1;
            q.push(j);
        }
    }
}
int main()
{
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    BFS();
    printf("%d",dist[n]-1);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值