nyoj 115 城市平乱 【BFS】

题意:中文题,不解释

策略:广搜。第一道广搜题,先从目标点开始,进队列,标记此节点已被找过,以对首为起始点再找与它相连(并且没有被标记的)的结点入队尾,删除队首,然后在以此时的队首为起始点,标记此节点已被找过, 找与它相邻的点(并且没有被标记的),删除队首,一直循环直至所有节点都被找完。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#define MAXN 0x3f3f3f3f
using std::queue;
int map[1005][1005];  //储存两个城市来回的时间
bool vis[1005];
struct node{
	int isarmy;//标记该城市有没有军队
	int time; //到每个城市的时间
}armys[1005];
int bfs(int m, int Q)
{
	queue<int> q;
	int sum = MAXN;
	memset(vis, 0, sizeof(vis)); //标记几点有没有被搜索过
	q.push(Q); //从目标开始
	vis[Q] = 1;
	int temp; //当前的队首
	while(!q.empty()){
		temp = q.front();
		for(int i = 1; i <= m; i ++){
			if(!vis[i]&&map[temp][i]){
				armys[i].time += map[temp][i] + armys[temp].time;
				vis[i] = 1;
				q.push(i);
				if(armys[i].isarmy&&armys[i].time < sum) sum = armys[i].time; //判断是否有军队到达并且时间最少
			}
		}
		q.pop();
	}
	return sum;
}
int main()
{
	int t, n, m, q, p, i, j;
	scanf("%d", &t);
	while(t --){
		scanf("%d%d%d%d", &n, &m, &p, &q);
		memset(armys, 0, sizeof(armys));
		memset(map, 0, sizeof(map));
		int temp;
		for(i = 0; i < n; i ++){
			scanf("%d", &temp);
			armys[temp].isarmy = 1;
		}
		int a, b, c;
		for(i = 0; i < p; i ++){
			scanf("%d%d%d", &a, &b, &c);
			if(map[a][b] > c||!map[a][b]){
				map[a][b] = map[b][a] = c;
			}
		}
		int ans;
		ans = bfs(m, q);
		printf("%d\n", ans);
	}
	return 0;
}

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=115

nyoj 115 城市平乱 【BFS】

时间: 2024-10-30 08:40:09

nyoj 115 城市平乱 【BFS】的相关文章

NYOJ 115 城市平乱

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

nyoj 115 城市平乱(dijkstra)

城市平乱 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路. 输入 第一行输入一个整数T,表示测试数据的组数.(T<20)每组测试数

NYOJ 115 城市平乱(Dijkstra入门)

链接:click here 题意: 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市.他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M.现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱.现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 思路:最短路问题入门题:出的数据比较水,看到别人都是用优先队列的Dijkstra实现, 效率

nyist oj 115 城市平乱 (最短路径)

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

NYOJ 城市平乱

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

nyoj 115------城市平乱( dijkstra // bellman )

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

NYOJ115 城市平乱 【SPFA】

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

城市平乱(南阳oj115)(迪杰斯特拉算法)

城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M. 现在,小工军师告诉南将军,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱. 现在已知在任意两个城市之间的路行军所需的时间,你作为南将军麾下最厉害的程序员,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间. 注意,两个城市之间可能不只一条路.

nyoj 城市平乱(Dijkstra)

裸 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #include<climits&g