1003 Emergency

Posted kkmjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1003 Emergency相关的知识,希望对你有一定的参考价值。

题意:

思路:

代码:

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int Inf=0x7fffffff;
const int maxn=510;
struct Node{
    int v;
    int d;
    Node(int v_,int d_):v(v_),d(d_){}
};
vector<Node> Adj[maxn];
int mindis[maxn];//mindis[i]表示起点s到结点i的最短距离
int maxweight[maxn];//maxweight[i]表示起点s到结点i的最大点权
bool vis[maxn];
int num[maxn];//num[i]表示起点s到结点i最短路径的条数

int weight[maxn];//各点的点权,有数据输入
int n,m,s,e;//顶点数,边数,起点,终点

void Dijkstra(int s)
{
    //part 1:init
    fill(mindis,mindis+maxn,Inf);
    mindis[s]=0;
    fill(vis,vis+maxn,false);
    fill(maxweight,maxweight+maxn,0);
    maxweight[s]=weight[s];
    fill(num,num+maxn,0);
    num[s]=1;

    for(int k=0;k<n;k++){
        //part 2:find the min vertex in mindis[]
        int u=-1,min=Inf;
        for(int v=0;v<n;v++){
            if(!vis[v] && mindis[v]<min){
                min=mindis[v];
                u=v;
            }
        }
        if(u==-1) return;
        vis[u]=true;
        //part 3:relax operation
        for(Node node:Adj[u]){//考察(u-v)
            int v=node.v, d=node.d;
            if(!vis[v]){
                if(mindis[u]+d < mindis[v]){//第1标尺
                    mindis[v]=mindis[u]+d;
                    maxweight[v]=maxweight[u]+weight[v];
                    num[v]=num[u];
                }else if(mindis[u]+d == mindis[v]){//第2标尺
                    if(maxweight[u]+weight[v] > maxweight[v])
                        maxweight[v]=maxweight[u]+weight[v];
                    num[v]+=num[u];
                }
            }
        }
    }
}

int main()
{
    scanf("%d%d%d%d",&n,&m,&s,&e);
    for(int i=0;i<n;i++) scanf("%d",&weight[i]);
    int u,v,d;
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&u,&v,&d);
        Adj[u].push_back(Node(v,d));
        Adj[v].push_back(Node(u,d));
    }
    Dijkstra(s);
    printf("%d %d
",num[e],maxweight[e]);
    return 0;
}

 

以上是关于1003 Emergency的主要内容,如果未能解决你的问题,请参考以下文章

PAT-1003 Emergency

1003. Emergency

1003 Emergency

PAT 1003. Emergency

甲级1003 Emergency

1003 Emergency (25 分)