博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5415 [NOI2018] 归程
阅读量:7109 次
发布时间:2019-06-28

本文共 2625 字,大约阅读时间需要 8 分钟。

今天也要踏上归程了呢~(题外话

kruskal重构树!当时就听学长们说过是重构树辣所以做起来也很快233

就是我们按照a建最大生成树 这样话呢我们就可以通过生成树走到尽量多的点啦

然后呢就是从这个子树内走到1的最短路 提前处理出来然后就是子树最小值啦w

附代码。(些许丑陋(

//Love and Freedom.#include
#include
#include
#include
#include
#define ll long long#define inf 20021225#define N 400010#define M 800010using namespace std;struct edge{
int x,y,v;}g[M];struct edg{
int to,lt,v;}e[M],t[N];struct node{ int id,v; node(){} node(int _id,int _v){id=_id,v=_v;}};bool operator <(node a,node b){
return a.v>b.v;}priority_queue
q;int cnt,in[N];void add(int x,int y,int l,int a){ e[++cnt].to=y; e[cnt].lt=in[x]; e[cnt].v=l; in[x]=cnt; e[++cnt].to=x; e[cnt].lt=in[y]; e[cnt].v=l; in[y]=cnt; g[cnt>>1].x=x; g[cnt>>1].y=y; g[cnt>>1].v=a;}void tree(int x,int y){ t[++cnt].to=y; t[cnt].lt=in[x]; in[x]=cnt;}int bel[N],n,val[N],m; bool vis[N];int find(int x){ //printf("%d %d\n",x,bel[x]); if(bel[x]==x) return x; return bel[x]=find(bel[x]);}void dijkstra(){ memset(vis,0,sizeof(vis)); memset(val,48,sizeof(val)); val[1]=0; q.push(node(1,val[1])); while(!q.empty()) { node tmp = q.top(); q.pop(); if(vis[tmp.id]) continue; vis[tmp.id]=1; int x=tmp.id; for(int i=in[x];i;i=e[i].lt) { int y=e[i].to; if(val[y]>val[x]+e[i].v) val[y]=val[x]+e[i].v,q.push(node(y,val[y])); } }}bool cmp(edge x,edge y){ return x.v>y.v;}int poi;int mn[N],f[N][18];void kruskal(){ //memset(bel,0,sizeof(bel)); sort(g+1,g+m+1,cmp); memset(mn,48,sizeof(mn)); memset(in,0,sizeof(in)); cnt=0; poi=n; for(int i=1;i<=m;i++) { int x=g[i].x,y=g[i].y; int fx=find(x),fy=find(y); if(fx==fy) continue; val[++poi]=g[i].v; tree(poi,fx); tree(poi,fy); bel[fx]=bel[fy]=poi; }}void dfs(int x){ vis[x]=1; for(int i=1;i<18;i++) f[x][i]=f[f[x][i-1]][i-1]; for(int i=in[x];i;i=t[i].lt) { int y=t[i].to; f[y][0]=x; dfs(y); mn[x]=min(mn[x],mn[y]); } if(x<=n) mn[x]=val[x];}int getans(int x,int w){ for(int i=17;~i;i--) if(val[f[x][i]]>w) x=f[x][i]; //printf("%d\n",val[x]); return mn[x];}int main(){ int T;scanf("%d",&T); while(T--) { memset(in,0,sizeof(in)); cnt=0; scanf("%d%d",&n,&m); int u,v,l,a; for(int i=1;i<=2*n;i++) bel[i]=i; for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&u,&v,&l,&a); add(u,v,l,a); } dijkstra(); kruskal(); memset(vis,0,sizeof(vis)); for(int i=1;i<2*n;i++) if(!vis[i]) dfs(find(i)); int Q,k,s,lastans=0,p; scanf("%d%d%d",&Q,&k,&s); val[0]=0; while(Q--) { scanf("%d%d",&v,&p); v=(v+k*lastans-1)%n+1; p=(p+k*lastans)%(s+1); printf("%d\n",lastans=getans(v,p)); } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/hanyuweining/p/10386700.html

你可能感兴趣的文章
媒体类型和字符集
查看>>
iOS keyChain
查看>>
GIT在LINUX下的基本操作
查看>>
关于 android receiver
查看>>
Automysqlbackup: WARNING: Turning off multicore support, since pigz isn’t there.
查看>>
Matlab中如何将(自定义)函数作为参数传递给另一个函数
查看>>
PCL—低层次视觉—点云分割(RanSaC)
查看>>
Apache、tomcat、Nginx常用配置合集
查看>>
每天一个linux命令(34):kill命令
查看>>
安装fcitx [Crunch bang] [debian]
查看>>
记录sql语句的执行记录,用于分析
查看>>
js和jquery判断事件流
查看>>
【安卓特效】怎样给ImageView加上遮罩,点击时泛黑、或泛白、?
查看>>
HDU--3829--Cat VS Dog【最大点独立集】
查看>>
SQL约束
查看>>
第十一章 非对称加密算法--DH
查看>>
HDU 3265 Posters
查看>>
iframe超时处理。。。。
查看>>
MyCAT实现MySQL的读写分离
查看>>
Codeforces554A:Kyoya and Photobooks
查看>>