zoukankan      html  css  js  c++  java
  • TYVJ P1577 泥泞的道路

    题目链接:http://www.tyvj.cn/p/1577#

    P1577 泥泞的道路
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    公园中有n个景点,编号1~n,并由m条双向道路相连。由于昨天下雨,导致公园中的马路泥泞不堪,每条道路都有一个泥泞程度w。现有Q个游客依次向你求 助,想从景点X走到景点Y,他希望找到一条道路,使得经过道路泥泞程度的最大值尽量小。你能设计一个在线算法,帮他们找到方案吗?

    输入格式

    第一行两个正整数n和m,表示景点数和道路数。
    随后m行每行三个正整数x、y、w,用来描述一条道路,它连接x和y景点并且泥泞程度为w。
    随后Q行,每行四个参数p1、p2、q1、q2,含义如下:
    设数列Si表示你求得的第i个询问的结果(s0=1),则对于第i个询问:
    X=(Si-1+p1)*p2 mod n + 1;
    Y=(si-1+q1)*q2 mod n + 1;

    输出格式

    请对于每个询问,输出结果,即Si。

    测试样例1

    输入

    4 4
    1 2 2
    2 3 1
    1 3 3
    3 4 5
    2
    3 1 0 2
    1 1 2 1

    输出

    2
    5
    说明:第一个询问是{x=1,y=3},第二个询问是{x=4,y=1}。

    备注

    对于30%的数据,n<=1000,m<=3000,Q<=1000;
    对于100%的数据,n<=100000,m<=300000,Q<=100000;
    对于100%的数据,0<=p1、p2、q1、q2<n,w<300000。

    在线问。两点之间的边的最大值最小。

    先MST构造一棵树。

    然后LCA询问,可是这道题爆栈,加栈也没用,还有这种LCA也第一次写,WA不少。

    DFS变成BFS应该可以A了

      1 #pragma comment(linker, "/STACK:1024000000,1024000000")
      2 #include<iostream>
      3 #include<algorithm>
      4 #include<cmath>
      5 #include<string.h>
      6 #include<vector>
      7 #include<stdio.h>
      8 
      9 
     10 using namespace std;
     11 #define N 623456
     12 struct node
     13 {
     14     int x,y,z;
     15 }a[N];
     16 
     17 int f[N];
     18 
     19 int find(int x)
     20 {
     21     if (f[x]!=x) f[x]=find(f[x]);
     22     return f[x];
     23 }
     24 
     25 struct nod
     26 {
     27   int v,c,next;
     28 }e[N<<1];
     29 int head[N],tot;
     30 
     31 int cmp(node a,node b)
     32 {
     33     return a.z<b.z;
     34 }
     35 
     36 void add(int u,int v,int z)
     37 {
     38     e[tot].v=v;
     39     e[tot].c=z;
     40     e[tot].next=head[u];
     41     head[u]=tot++;
     42 }
     43 int dp[N][20],dep[N];
     44 int dpmax[N][20];
     45 
     46 void dfs(int u,int fa,int t,int z)
     47 {
     48     dp[u][0]=fa;
     49     dpmax[u][0]=z;
     50     dep[u]=t;
     51     for (int i=head[u];i!=-1;i=e[i].next)
     52     {
     53         int v=e[i].v;
     54         if (v==fa) continue;
     55         //dpmax[v][0]=e[i].c;
     56         dfs(v,u,t+1,e[i].c);
     57     }
     58 }
     59 
     60 int lca(int u,int v)
     61 {
     62     if (dep[u]<dep[v]) swap(u,v);
     63     int dif=dep[u]-dep[v];
     64 
     65     int res=0;
     66     for (int i=0;i<20;i++)
     67     if ((dif>>i)&1) res=max(res,dpmax[u][i]),u=dp[u][i];
     68 
     69     if (u==v) return res;
     70     for (int i=19;i>=0;i--)
     71     if (dp[u][i]!=dp[v][i]) {
     72             res=max(res,dpmax[u][i]),
     73             res=max(res,dpmax[v][i]);
     74             u=dp[u][i],v=dp[v][i];
     75     }
     76     if (u!=v) res=max(res,dpmax[u][0]),res=max(res,dpmax[v][0]);
     77     return res;
     78 }
     79 inline int read()
     80 {
     81     int x=0,f=1;char ch=getchar();
     82     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     83     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     84     return x*f;
     85 }
     86 int main()
     87 {
     88     int n,m;
     89   //  freopen("input.txt","r",stdin);
     90     memset(head,-1,sizeof(head));
     91     tot=0;
     92    // scanf("%d%d",&n,&m);
     93     n=read();
     94     m=read();
     95     for (int i=1;i<=m;i++) //scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
     96     a[i].x=read(),a[i].y=read(),a[i].z=read();
     97 
     98     sort(a+1,a+m+1,cmp);
     99     for (int i=1;i<=n;i++) f[i]=i;
    100     for (int i=1;i<=m;i++)
    101     {
    102         int x=find(a[i].x);
    103         int y=find(a[i].y);
    104         if (x!=y)
    105         {
    106             add(a[i].x,a[i].y,a[i].z);
    107             add(a[i].y,a[i].x,a[i].z);
    108             f[x]=y;
    109         }
    110     }
    111     dfs(1,0,0,0);
    112     //for (int i=1;i<=n;i++) cout<<dpmax[i][0]<<endl;
    113 
    114     for (int i=1;i<20;i++)
    115     for (int j=1;j<=n;j++){
    116     dpmax[j][i]=max(dpmax[j][i-1],dpmax[dp[j][i-1]][i-1]);
    117     dp[j][i]=dp[dp[j][i-1]][i-1];
    118     }
    119 
    120     int Q;
    121    // scanf("%d",&Q);
    122     Q=read();
    123     int ans=1;
    124     while (Q--)
    125     {
    126         int p1,p2,q1,q2;
    127        // scanf("%d%d%d%d",&p1,&p2,&q1,&q2);
    128         p1=read(),p2=read(),q1=read(),q2=read();
    129         int x=1ll*(ans+p1)*p2%n+1;
    130         int y=1ll*(ans+q1)*q2%n+1;
    131       //  cout<<x<<y<<endl;
    132         ans=lca(x,y);
    133         printf("%d ",ans);
    134     }
    135     return 0;
    136 }

  • 相关阅读:
    c语言 inline函数
    ubuntu18.04 安装新版本openssl
    convert_mnist_data.cpp
    caffe 安装方法和记录
    【转】jdbc:oracle:thin:@localhost:1521:orcl与jdbc:oracle:thin:@//localhost:1521/orcl区别
    【原创】【HCIA】验证GaussDB 100系统函数to_nchar()是否能支持最大字节长度8000
    【原创】达梦数据库DM7备份与恢复
    【LINUX】操作系统时钟与硬件时钟设置
    【文档】ORACLE RAC 修改SCAN监听端口、VIP网络配置参考文档
    【转】11G R2 RAC: HOW TO IDENTIFY THE MASTER NODE IN RAC
  • 原文地址:https://www.cnblogs.com/forgot93/p/4840079.html
Copyright © 2011-2022 走看看