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的主要内容,如果未能解决你的问题,请参考以下文章