您的位置:首页 > 其它

FJNU校赛B题(dfs + bfs)

2015-04-20 17:43 309 查看
题意:

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

思路:

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: