两者题目本质上是一样的,都是要找到最小的复合要求的方案,但是后者要求打印出路径。
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 1Sample 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;
}
}
}