码迷,mamicode.com
首页 > 其他好文 > 详细

1003 Emergency

时间:2018-09-03 19:59:40      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:push   路径   names   起点   art   init   ndis   relax   const   

题意:

思路:

代码:

#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\n",num[e],maxweight[e]);
    return 0;
}

 

1003 Emergency

标签:push   路径   names   起点   art   init   ndis   relax   const   

原文地址:https://www.cnblogs.com/kkmjy/p/9580417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!