列表

详情


NC14122. ACM Battle

描述

古往今来的各种传说中存在着很多魔法阵,它们的激活方式也各不相同。传说在北师大电子楼前的小花园里就有一个魔法阵,上次出现还是在很多很多很多年前,但是现在它又出现了!
这时,小Q同学面无表情地说:“传说这个魔法阵都会在都会在来自远古的恶魔Awesome Crystal Monster(ACM)降临的时候出现,现在,这个时候终于要到来了吗!”话音未落,小Q同学已经走到了魔法阵前,取出一个小瓶,开始用瓶中的圣水激活这个魔法阵,“你们快退后,这里就交给我了!”
这个魔法阵由一些点和一些连接这些点的边构成,当小Q同学把圣水滴在一个点上时,和这个点相连的所有边就会被点亮并发出神圣的光芒,当魔法阵所有的边都点亮的时候,就会出现强大的神圣力量。但是小Q同学拥有的圣水非常有限,只有10滴,现在小Q同学想知道他最少可以用多少滴圣水点亮整个魔法阵,如果耗尽圣水也不能点亮,就只能打出一波GG了。

输入描述

第一行包含一个正整数T(≤ 20),表示测试数据的组数,
对于每组测试数据,
第一行是两个整数n(1 ≤ n ≤ 1000)和m(1 ≤ m ≤ 2000),表示魔法阵的点数和边数,
接下来m行,每行包含两个整数u,v(1 ≤ u,v ≤ n),表示有一条边连接了u号点和v号点。

输出描述

对于每组测试数据,如果使用不超过10滴圣水可以点亮整个魔法阵,输出最少需要的圣水滴数,否则输出"GG"(不含引号)。

示例1

输入:

2
4 3
1 2
1 3
1 4
4 4
1 2
2 3
3 4
4 1

输出:

1
2

说明:

对于第一组样例,最优方案是在1号点滴一滴圣水,
对于第二组样例,一个最优方案是在1号点和3号点各滴一滴圣水。

原站题解

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

C++14(g++5.4) 解法, 执行用时: 13ms, 内存消耗: 688K, 提交时间: 2020-07-05 20:27:04

#include<bits/stdc++.h>
#define Fox ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N=2e3+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
int T,n,m,ans,v[N];
struct Node{
	int l,r;
}edge[N]; 
void dfs(int x,int p){
	if(p>=ans)return;
	if(x==m+1){
		ans=min(ans,p);
		return;
	}
	if(v[edge[x].l] || v[edge[x].r])dfs(x+1,p);
	else{
		v[edge[x].l]=1;
		dfs(x+1,p+1);
		v[edge[x].l]=0;
		v[edge[x].r]=1;
		dfs(x+1,p+1);
		v[edge[x].r]=0;
	}
}
int main(){
	Fox;
	cin>>T;
	while(T--){
		cin>>n>>m;
		ans=11;memset(v,0,sizeof(v));
		for(int i=1;i<=m;i++)cin>>edge[i].l>>edge[i].r;
		dfs(1,0);
		if(ans<=10)cout<<ans<<"\n";
		else cout<<"GG\n";
	}
    return 0;
}

C++(clang++11) 解法, 执行用时: 20ms, 内存消耗: 384K, 提交时间: 2021-02-25 10:45:22

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
int n,m,vis[N],u[N],v[N],ans;
void dfs(int x,int cnt){
	if(cnt>10||cnt>ans)	return ;
	if(x==m+1){ans=min(ans,cnt);	return ;}
	if(vis[u[x]]||vis[v[x]])	dfs(x+1,cnt);
	else{
		vis[u[x]]=1,dfs(x+1,cnt+1),vis[u[x]]=0;
		vis[v[x]]=1,dfs(x+1,cnt+1),vis[v[x]]=0;
	}
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=m;i++)	cin>>u[i]>>v[i];
	ans=1e9;	dfs(1,0);
	if(ans==1e9)	puts("GG");
	else	printf("%d\n",ans);
}
int main(){
	int T;	cin>>T;	while(T--)	solve();
	return 0;
}

上一题