uva10817 dijkstra

大白书P330

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1000+10;
const int INF = 1000000000;
struct Edge{
  int from,to,dist;
};
struct HeapNode{
   int d,u;
   bool operator <(const HeapNode &rhs)const {
       return d>rhs.d;
   }
};
struct Dijkstra{
   int n,m;
   vector<Edge> edges;
   vector<int>G[maxn];
   bool done[maxn];
   int d[maxn];
   int p[maxn];
   void inti(int n){
       this->n=n;
       for(int i=0; i < n; ++i)
        G[i].clear();
       edges.clear();
   }
   void AddEdge(int from, int to, int dist){
       edges.push_back((Edge){from,to,dist});
       int m =edges.size();
       G[from].push_back(m-1);
   }
   void dijkstra(int s){
      priority_queue<HeapNode> Q;
      for(int i=0; i<n; i++) d[i]=INF;
      d[s] = 0;
      memset(done, false,sizeof(done));
      Q.push((HeapNode){0,s});
      while(!Q.empty()){
          HeapNode x =Q.top();Q.pop();
          int u =x.u;
          if(done[u])continue;
          done[u] =true;
          for(int i=0; i<G[u].size(); ++i){
              Edge &e = edges[G[u][i]];
              if(d[e.to]>d[u]+e.dist){
                 d[e.to] = d[u] +e.dist;
                 p[e.to]  = G[u][i];
                 Q.push((HeapNode){d[e.to],e.to});
              }
          }
      }
   }
}solve1;
vector<int> R[maxn];
int dp[maxn];
int dfs(int u){
    if(dp[u]!=-1)  return dp[u];
    if(u==1) return 1;
    dp[u]=0;
    for(int i =0 ; i<R[u].size(); i++){
         int v = R[u][i];
         dp[u]+=dfs(v);
    }
    return dp[u];
}
int main()
{
    int n,m;
    while(scanf("%d",&n)==1&&n){
         scanf("%d",&m);
         solve1.inti(n);
         for(int i = 0; i<m; ++i){
              int u,v,d;
              scanf("%d%d%d",&u,&v,&d); u--,v--;
              solve1.AddEdge(u,v,d);
              solve1.AddEdge(v,u,d);
         }
         solve1.dijkstra(1);
         for(int i = 0; i<n; i++) R[i].clear();
         for(int i = 0; i < solve1.edges.size(); ++i){
               int u=solve1.edges[i].from, v=solve1.edges[i].to;
               if(solve1.d[u]>solve1.d[v])
                 R[u].push_back(v);
         }
         memset(dp,-1,sizeof(dp));
         printf("%d\n",dfs(0));
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Opaser/p/4320090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值