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;
}

 

posted @ 2020-12-12 14:58  grass_lin  阅读(72)  评论(0编辑  收藏  举报