题目链接: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<<];
 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][],dep[N];
 44 int dpmax[N][];
 45 
 46 void dfs(int u,int fa,int t,int z)
 47 {
 48     dp[u][]=fa;
 49     dpmax[u][]=z;
 50     dep[u]=t;
 51     for (int i=head[u];i!=-;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+,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=;
 66     for (int i=;i<;i++)
 67     if ((dif>>i)&) res=max(res,dpmax[u][i]),u=dp[u][i];
 68 
 69     if (u==v) return res;
 70     for (int i=;i>=;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][]),res=max(res,dpmax[v][]);
 77     return res;
 78 }
 79 inline int read()
 80 {
 81     int x=,f=;char ch=getchar();
 82     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
 83     while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
 84     return x*f;
 85 }
 86 int main()
 87 {
 88     int n,m;
 89   //  freopen("input.txt","r",stdin);
 90     memset(head,-,sizeof(head));
 91     tot=;
 92    // scanf("%d%d",&n,&m);
 93     n=read();
 94     m=read();
 95     for (int i=;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+,a+m+,cmp);
 99     for (int i=;i<=n;i++) f[i]=i;
     for (int i=;i<=m;i++)
     {
         int x=find(a[i].x);
         int y=find(a[i].y);
         if (x!=y)
         {
             add(a[i].x,a[i].y,a[i].z);
             add(a[i].y,a[i].x,a[i].z);
             f[x]=y;
         }
     }
     dfs(,,,);
     //for (int i=1;i<=n;i++) cout<<dpmax[i][0]<<endl;
 
     for (int i=;i<;i++)
     for (int j=;j<=n;j++){
     dpmax[j][i]=max(dpmax[j][i-],dpmax[dp[j][i-]][i-]);
     dp[j][i]=dp[dp[j][i-]][i-];
     }
 
     int Q;
    // scanf("%d",&Q);
     Q=read();
     int ans=;
     while (Q--)
     {
         int p1,p2,q1,q2;
        // scanf("%d%d%d%d",&p1,&p2,&q1,&q2);
         p1=read(),p2=read(),q1=read(),q2=read();
         int x=1ll*(ans+p1)*p2%n+;
         int y=1ll*(ans+q1)*q2%n+;
       //  cout<<x<<y<<endl;
         ans=lca(x,y);
         printf("%d\n",ans);
     }
     return ;
 }

TYVJ P1577 泥泞的道路的更多相关文章

  1. Codevs 1183 泥泞的道路

    1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路 ...

  2. 【Codevs1183】泥泞的道路

    Position: http://codevs.cn/problem/1183/ List Codevs1183 泥泞的道路 List Description Input Output Sample ...

  3. codevs1183 泥泞的道路(01分数规划)

    1183 泥泞的道路  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description CS有n个小区,并且任意小区之间都有两 ...

  4. codevs1183 泥泞的道路

    题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...

  5. 泥泞的道路(codevs 1183)

    题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...

  6. codevs 1183 泥泞的道路 01分数规划

    题目链接 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和 ...

  7. CODEVS——T1183 泥泞的道路

    时间限制: 1 s  空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到 ...

  8. codevs1183泥泞的道路

    题意:给定一张有向稠密图和通过每条边的时间和路程,问从1到n的路程/时间 最大为多少 正解:SPFA+二分答案 开始做的时候,想直接跑图论,后来发现好像不对(不然数据范围怎么这么小) 但是显然要用到图 ...

  9. codevs 1183 泥泞的道路 (二分+SPFA+差分约束)

    /* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简 ...

随机推荐

  1. 接口和类方法中的 SELF

    接口和类方法中的 SELF 由 王巍 (@ONEVCAT) 发布于 2015/06/10 我们在看一些接口的定义时,可能会注意到出现了首字母大写的 Self 出现在类型的位置上: protocol I ...

  2. 有趣的this以及apply,call,bind方法

    看this指向谁,要看执行时而非定义时(箭头函数除外).函数没有绑定在对象上调用,非'strict'模式下,this指向window,否则为undefined 改变this指向的方法 1. apply ...

  3. Django_外键查询和反查询

    一.ForeignKey @property装饰器的作用是返回一个属性特性,在数据库中也有一些小技巧可以拿来用,比如今天要写的外键查询和反向查询的内容. from django.db import m ...

  4. 使用 HTML5 Geolocation 构建基于地理位置的 Web 应用学习网站分享

    HTML5 中的新功能 HTML5 是最新一代的 HTML 规范,是 W3C 与 WHATWG 合作的结果,目前仍外于开发中.自从上一代 HTML4,Web 世界已经发生了巨大的变化,HTML5 的到 ...

  5. php数据查询之基础查询

    ---恢复内容开始--- 数据查询语言(Data Query Language) 基本查询 语法形式: select [all | distinct ] 字段或者表达式列表 [from子句] [whe ...

  6. (转)UIPanGestureRecognizer

    UIPanGestureRecognizer是UIGestureRecognizer类的一个扩展类,其扩展类有UITapGestureRecognizer,UIPinchGestureRecogniz ...

  7. python中split()函数讲解

    本文讲述的是string.split(s[, sep[, maxsplit]]),针对string类型的split()函数.它主要是切割字符串,结果返回由字符串元素组成的一个列表,具体怎么使用看下面的 ...

  8. Memcached特性及优缺点

    为了加快文件访问速度且提供多个使用者.需要在内存中建立内存缓存数据的管理减小读写磁盘的次数及保证数据的更新.因为需要使用cache缓存.   1.Memcached 主要特性 a.数据仅存在于内存中, ...

  9. 算法学习记录-图——最短路径之Dijkstra算法

    在网图中,最短路径的概论: 两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点. 维基百科上面的解释: 这个算法是通过为每个顶点 v 保留目前为止所找到的从 ...

  10. Codeforces 545E. Paths and Trees[最短路+贪心]

    [题目大意] 题目将从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 题目要求一颗最短生成树,输出总边权和与选取边的编号.[题意分析] 比如下面的数据: 5 5 1 2 2 ...