zoukankan      html  css  js  c++  java
  • [BalticOI2002]Bicriterial routing

    OJ题号:
      BZOJ1375、ECNU1468

    题目大意:
      给定一个无向连通图,每条边有两个权值w1和w2。定义一条路径是优秀的当且仅当没有别的路径满足两个权值的和都比该路径小,求s到t的优秀路径条数。

    思路:
      将其中一个权值转化为最短路的一个维度,也就是求出对于同一个结点的不同的w1的和,最小的w2和。
      然后直接跑Dijkstra就可以了。

     1 #include<cstdio>
     2 #include<cctype>
     3 #include<vector>
     4 #include<functional>
     5 #include<ext/pb_ds/priority_queue.hpp>
     6 inline int getint() {
     7     register char ch;
     8     while(!isdigit(ch=getchar()));
     9     register int x=ch^'0';
    10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    11     return x;
    12 }
    13 const int inf=0x7fffffff;
    14 const int V=101,W=101;
    15 struct Edge {
    16     int to,w1,w2;
    17 };
    18 std::vector<Edge> e[V];
    19 inline void add_edge(const int &u,const int &v,const int &w1,const int &w2) {
    20     e[u].push_back((Edge){v,w1,w2});
    21 }
    22 int n,m,s,t;
    23 struct Vertex {
    24     int dis,id,w;
    25     bool operator > (const Vertex &another) const {
    26         return dis>another.dis;
    27     }
    28 };
    29 int d[V][(V-1)*W];
    30 __gnu_pbds::priority_queue<Vertex,std::greater<Vertex>> q;
    31 __gnu_pbds::priority_queue<Vertex,std::greater<Vertex>>::point_iterator p[V][V*W];
    32 inline void dijkstra() {
    33     for(register int i=1;i<=n;i++) {
    34         for(register int j=0;j<(n-1)*W;j++) {
    35             p[i][j]=q.push((Vertex){d[i][j]=(i==s&&j==0)?0:inf,i,j});
    36         }
    37     }
    38     while(q.top().dis!=inf) {
    39         const Vertex x=q.top();
    40         for(register unsigned i=0;i<e[x.id].size();i++) {
    41             const Edge &y=e[x.id][i];
    42             if((x.w+y.w1)<(n-1)*W&&(x.dis+y.w2)<d[y.to][x.w+y.w1]) {
    43                 q.modify(p[y.to][x.w+y.w1],(Vertex){d[y.to][x.w+y.w1]=x.dis+y.w2,y.to,x.w+y.w1});
    44             }
    45         }
    46         q.modify(p[x.id][x.w],(Vertex){inf,x.id,x.w});
    47     }
    48     q.clear();
    49 }
    50 int main() {
    51     n=getint(),m=getint(),s=getint(),t=getint();
    52     for(register int i=1;i<=m;i++) {
    53         int u=getint(),v=getint(),t=getint(),c=getint();
    54         add_edge(u,v,t,c);
    55         add_edge(v,u,t,c);
    56     }
    57     dijkstra();
    58     int ans=0,min=inf;
    59     for(register int i=0;i<(n-1)*W;i++) {
    60         if(d[t][i]==inf) continue;
    61         if(d[t][i]<min) {
    62             ans++;
    63             min=d[t][i];
    64         }
    65     }
    66     printf("%d
    ",ans);
    67     return 0;
    68 }
  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/skylee03/p/7561128.html
Copyright © 2011-2022 走看看