1003. Emergency和1030. Travel Plan

两者题目本质上是一样的,都是要找到最小的复合要求的方案,但是后者要求打印出路径。

1003:每个城市都有搜救队,两个城市之间有距离,给定两个城市,求S到D的最短路径一共有几条和这些方案下能集结到的最大搜救队个数。比如:

Sample Input
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
Sample Output
2 4

sample input的第一行,第一个数是城市的个数N,相应的,对应的城市从0到N-1,第二个数是共有几条路M,即图的边数,后两个数分别为起点后终点;第二行给出的分别是每个城市的搜救队个数;接下来M行,插入格式为“城市 城市 距离”

sample out第一个数字是最短路径条数,显然是0-1-2和0-2;第二个数字是搜救队个数,为0-1-2时,1+2+1=4。

构思:注意到N<=500,所以不妨用邻接矩阵存储图,要有全局变量cnt记录最短路径的条数,集结到的搜救队个数max_person,路径长度max_dist。显然,DFS中也要加入这些参数用来实时比较。

#include <stdio.h>
#include <stdlib.h>
int visited[501],matrix[501][501],rescue[501];
int N,max_dist=1000000,cnt,max_person;
void DFS(int start,int end,int dist,int persons);
int main() {
	int M,C1,C2;
	int c1,c2,L;
	scanf("%d %d %d %d",&N,&M,&C1,&C2);
	for(int i=0;i<N;i++)
		scanf("%d",&rescue[i]);
	for(int i=0;i<M;i++){
		scanf("%d %d %d",&c1,&c2,&L);
		matrix[c1][c2]=matrix[c2][c1]=L;
	}
	/*以上已经建立好了一个二维矩阵*/
	visited[C1]=1;
	DFS(C1,C2,0,rescue[C1]);
	printf("%d %d",cnt,max_person);
	return 0;
}
void DFS(int start,int end,int dist,int persons){
	if(start==end){
		if(dist<max_dist){
			cnt=1;
			max_dist=dist;
			max_person=persons;
		}else if(dist==max_dist){
			cnt++;
			if(max_person<persons)
				max_person=persons;
		}
		return;
	}
	if(dist>max_dist) return;
	for(int i=0;i<N;i++){
		if(visited[i]==0&&matrix[start][i]!=0){
			visited[i]=1;
			DFS(i, end, dist+matrix[start][i], persons+rescue[i]);
			visited[i]=0;
		}
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值