zoukankan      html  css  js  c++  java
  • 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
    ",way,max_num);
        return 0;
    }
  • 相关阅读:
    防止重复点击
    刷新当前页面的几种方法
    PHP删除数组中空值
    json转化数组
    两个不能同时共存的条件orWhere查询
    SQLSTATE[42000]
    laravel一个页面两个表格分页处理
    Hash::make与Hash::check
    unbind()清除指定元素绑定效果
    二级联动
  • 原文地址:https://www.cnblogs.com/ljxdtc666/p/14124703.html
Copyright © 2011-2022 走看看