zoukankan      html  css  js  c++  java
  • CF 449B Dijkstra最短路

      1 #include<iostream>
      2 #include<cstring>
      3 #include<string>
      4 #include<cmath>
      5 #include<cstdio>
      6 #include<queue>
      7 #define ll long long
      8 #define INF 1e16
      9 using namespace std;
     10 const int N = 8e5 + 10;
     11 struct edge
     12 {
     13     int u, to, next;
     14     ll w;
     15 }e[N];
     16 int head[N], cnt[N];
     17 ll dis[N];
     18 bool vis[N];
     19 int tot;
     20 
     21 typedef pair<ll, int> pii;
     22 
     23 void init()
     24 {
     25     for(int i = 0 ; i < N ; i++){
     26         e[i].next = -1;
     27         head[i] = -1;
     28         vis[i] = false;
     29     }
     30     tot = 0;
     31     for(int i = 0 ; i < N ; i++){
     32         dis[i] = INF;
     33     }
     34 }
     35 
     36 inline void add(int u, int v, ll w)
     37 {
     38     e[tot].u = u;
     39     e[tot].to = v;
     40     e[tot].w = w;
     41     e[tot].next = head[u];
     42     head[u] = tot++;
     43 }
     44 
     45 void JK(int now)
     46 {
     47     dis[now] = 0;//    
     48     priority_queue<pii, vector<pii>, greater<pii> >q;//
     49     q.push(make_pair(dis[now], now));
     50     while(!q.empty()){
     51         pii tmp = q.top();
     52         q.pop();
     53         ll d = tmp.first;
     54         int u = tmp.second;
     55         if(vis[u])    continue;
     56         vis[u] = true;
     57         for(int i = head[u] ; ~i ; i = e[i].next){
     58             int v = e[i].to;
     59             if(e[i].w + d == dis[v]){
     60                 cnt[v]++;
     61             }
     62             if(e[i].w + d < dis[v]){
     63                 cnt[v] = 1;
     64                 dis[v] = e[i].w + d;
     65                 q.push(make_pair(dis[v], v));
     66             }
     67         }
     68     }
     69 }
     70 
     71 int n, m, k;
     72 
     73 int main(){
     74     scanf("%d%d%d",&n,&m,&k);
     75     init();
     76     for(int i = 1 ; i <= m ; i++){
     77         int u, v, w;
     78         scanf("%d%d%lld",&u,&v,&w);
     79         add(u, v, w);
     80         add(v, u, w);
     81     }
     82     for(int i = 1 ; i <= k ; i++){
     83         int v, w;
     84         scanf("%d%lld",&v,&w);
     85         add(1, v, w);
     86         add(v, 1, w);
     87     }
     88     
     89     JK(1);
     90     int ans = 0;
     91     for(int i = (m << 1), c = 1 ; c <= k ; c++, i += 2){
     92         int v = e[i].to, w = e[i].w;
     93         if(dis[v] < w){
     94             ans++;
     95         }else if(dis[v] == w){
     96             if(cnt[v] > 1){
     97                 ans++;
     98                 cnt[v]--;
     99             }
    100         }
    101     }
    102     printf("%d
    ",ans);
    103     
    104     return 0;
    105 }
  • 相关阅读:
    POST请求
    怎样在ios开发中设置tableview的cell颜色
    error LNK2005 已经在***.obj中定义
    IOS开发之UIView的基本使用
    [置顶] 浅谈Android的资源编译过程
    IOS开发之UIView总结
    鉴别不使用的索引
    浅谈Jquery的使用下篇
    Go如何使用实现继承的组合
    做一个小淘气轮廓--文章和论文专辑
  • 原文地址:https://www.cnblogs.com/ecustlegendn324/p/14002102.html
Copyright © 2011-2022 走看看