FJNU校赛B题(dfs + bfs)

题意:

给出几个城市,以及街道,现在有几座城市着火了,尼克扑灭其中其中一些.然后剩下的火每天会往相邻的城市蔓延;问怎么选择扑灭的城市使全部烧完用时最长,输出时间;


思路:

dfs找到所有可能的扑灭情况,每种情况bfs算出要几天;


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;

int fire[10];
int vis[10];
int ans, n, m, l, p;
vector<int> v[105];

struct point {
	int pos;
	int step;
};
int bfs();
void dfs(int cur, int tar) {
	if(cur == p) {
//		for(int i = 0 ; i < l; i++) {
//			printf("%d ",vis[i]);
//		}
//		printf("\n");
		int tmp = bfs();
//		printf("%d\n",tmp);
		if(tmp > ans)
			ans = tmp;
		return;
	}
	if(tar >= l)
		return ;
	vis[tar] = 1;
	dfs(cur + 1,tar + 1);
	vis[tar] = 0;
	dfs(cur, tar + 1);
	return ;
}
int bfs() {
	queue<point> q;
	int viss[105];
	memset(viss, 0, sizeof(viss));
	while(!q.empty())
		q.pop();
	for(int i = 0; i < l; i++) {
		if(!vis[i]) {
			point a;
			a.pos = fire[i];
			a.step = 0; 
			q.push(a);
			viss[fire[i]] = 1;
		}
	}
	int res = 0;
	while(!q.empty()) {
		point cur = q.front();
		if(cur.step > res) {
			res = cur.step;
		}
		q.pop();
		for(int i = 0; i < v[cur.pos].size(); i++) {
			if(viss[v[cur.pos][i]])
				continue;
			point a;
			a.pos = v[cur.pos][i];
			a.step = cur.step + 1;
			q.push(a);
			viss[v[cur.pos][i]] = 1;		
		}
	}
	return res;
}
int main() {
	int t;
	int cas = 1;
	scanf("%d",&t);
	while(t--) {
		ans = 0;
		memset(vis, 0, sizeof(vis));
		scanf("%d%d%d%d",&n, &m, &l, &p);
		for(int i = 0; i <= n; i++) {
			v[i].clear();
		}
		for(int i = 0; i < l; i++) {
			scanf("%d",&fire[i]);
		}
		int a,b;
		for(int i = 0; i < m; i++) {
			scanf("%d%d",&a,&b);
			v[a].push_back(b);
			v[b].push_back(a);
		}
		dfs(0,0);
		printf("Case %d: %d\n",cas++, ans + 1);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值