PAT1003 Emergency
解题思路:
DFS,从起点开始遍历所有能到达终点的路,找出最短路径和最大的救援队伍数
#include <bits/stdc++.h> const int INF = 0x7fffffff; using namespace std; int n,m,c1,c2; int head[2000],tot; struct node { int to, nxt, w ; } e[2000]; void add (int x,int y,int z) { e[tot].to = y; e[tot].w = z; e[tot].nxt = head[x]; head[x] = tot++; } void add_edge(int x,int y,int z){ add(x,y,z); add(y,x,z); } int a[1000]; int visit[1000]; int max_num=0,min_dis=INF,way=0; void dfs(int st,int dis,int num) { if(st==c2) { if(dis<min_dis) //小于最短路程的情况 { min_dis=dis; way=1; max_num=num; } else if (dis==min_dis) //等于最短路程的情况 { way++; max_num = max(max_num,num); } return ; } visit[st]=1; for(int i=head[st];~i;i=e[i].nxt){ int v = e[i].to; if(!visit[v]&&e[i].w){ dfs(v,dis+e[i].w,num+a[v]); } } visit[st]=0; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d%d%d",&n,&m,&c1,&c2); for(int i=0; i<n; i++) { scanf("%d",&a[i]); } for(int i=0; i<m; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add_edge(x,y,z); } dfs(c1,0,a[c1]); printf("%d %d\n",way,max_num); return 0; }