列表

详情


NC227323. Baby's first game on graph

描述

A和B在玩一个和图有关的游戏,这个游戏在一张给定的个点条边的无向连通图上进行。

首先,A要选择一个任意的非负整数s,并将这个数字公布。

随后,B要选择该图的任意一个联通子图(子图的定义要求,若你选择了一条边,则必须选择该边所连接的两点;但若你选择了一个点,并不一定要选择它所连的所有边;一个孤立点也视为一个联通子图)。

最后,A要选择该联通子图中的任意一个点。

若该点在联通子图中的度数不超过(小于等于),则A获胜,B需要给A  元钱;否则,B获胜,A需要给B 元钱。

假设A和B都足够聪明,且目的都是使得游戏结束时自己所拥有的钱尽可能多,请你输出游戏结束后A所持有的金钱的变化量。

输入描述

第一行两个整数,表示给定图的点数和边数。

下面m行,每行两个整数,表示一条无向边。

输入保证图是连通的,且无自环和重边。

输出描述

输出一个数字,为游戏结束后A所持有的金钱的变化量。

示例1

输入:

4 4
1 2
2 3
3 4
4 1

输出:

114512

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 283ms, 内存消耗: 13108K, 提交时间: 2022-01-01 04:47:16

#include<bits/stdc++.h>
#define fori(s,t) for(int i=s;i<t;i++)
using namespace std;
int a[100005],b[100005],n,m,l,r,t,u,v;vector<int> c[100005];priority_queue<pair<int,int>> q;
int main(){
	cin>>n>>m;
	fori(1,m+1)cin>>l>>r,a[l]++,a[r]++,c[l].push_back(r),c[r].push_back(l);
	fori(1,n+1)q.push({-a[i],i});
	while(q.size()){
		u=q.top().second;q.pop();
		if(b[u])continue;b[u]=1;
		t=max(t,a[u]);
		fori(0,c[u].size())if(!b[v=c[u][i]])q.push({-(--a[v]),v});
	}cout<<114514-t<<'\n';
}

上一题