• [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 }
  • 相关阅读:
    2019-07-15_nginx 启动报错 “/var/run/nginx/nginx.pid" failed” 解决方法
    2019-07-12 linux下关闭、开启防火墙
    2019-07-12nginx的安装,启动,关闭
    2019-07-11 nginx 下网页显示乱码
    2019-07-05 submit左对齐快捷键
    2019-07-02 windows下用cmd命令netstat查看系统端口使用情况
    设计一个精致按钮
    JS 实现省市三级联动
    使用style 对象实现图片的覆盖(overlay)
    display 显示或隐藏元素
  • 原文地址:https://www.cnblogs.com/skylee03/p/7561128.html
Copyright © 2020-2023  润新知