HDU 5910Advanced Traffic System
来源:互联网 发布:淘宝卖家贴吧怎么引流 编辑:程序博客网 时间:2024/05/16 07:05
由于边数太多且大多相同我们考虑用点去扩展
类似想法就是把原来的边看做点 原来的点看做一群边 把原来这个点附近的边代表的点相连 把加边操作挂上线段树上 然后类似Dij做一遍 并查集处理做过的点
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<stack>using namespace std;char c;inline void read(int&a){a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}struct Chain{ Chain*next; int no;};struct Node{ int l,r; Chain*C;}T[400001];struct Side{ int A,B,dx,C,D,dy,w;}Li[60001];void Build(int place,int l,int r){ T[place].l=l,T[place].r=r,T[place].C=NULL; if(l^r) Build(place<<1,l,l+r>>1), Build(place<<1|1,(l+r>>1)+1,r);}void Add(int place,int l,int r,int no){ if(T[place].l>=l&&T[place].r<=r) { Chain*tp=new Chain; tp->next=T[place].C; tp->no=no;T[place].C=tp; return; } int Mid=T[place<<1].r; if(l<=Mid)Add(place<<1,l,r,no); if(r>Mid)Add(place<<1|1,l,r,no);}vector<int>R;bool Vis[100001];void S(int place,int r){ for(Chain*&tp=T[place].C;tp;tp=tp->next) if(!Vis[tp->no])R.push_back(tp->no); if(T[place].l==T[place].r)return; int Mid=T[place<<1].r; if(r<=Mid)return S(place<<1,r); return S(place<<1|1,r);}int Dis[90001];int u[301][301];priority_queue<pair<int,int> ,vector<pair<int,int> > ,greater<pair<int,int> > >Q;int f[302][302];inline void Extend(int x,int y,int dis){ if(f[x][y]^y)return; f[x][y]=y+1; int n=u[x][y]; Dis[n]=dis; R.clear(); S(1,n); for(int i=0;i<R.size();i++) { Vis[R[i]]=true; Q.push(make_pair(dis+Li[R[i]].w,R[i])); }}int F(int x,int y){return f[x][y]==y?y:f[x][y]=F(x,f[x][y]);}int main(){ int T; read(T); while(T--) { int n,m,e,sx,sy; read(n),read(m),read(e),read(sx),read(sy); memset(Dis,-1,sizeof(Dis)); memset(Vis,0,sizeof(Vis)); Build(1,1,n*m); for(int i=1;i<=n;i++) for(int j=1;j<=m+1;j++)f[i][j]=j; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) read(u[i][j]); for(int i=1;i<=e;i++) { int L,R; read(L),read(R),read(Li[i].A),read(Li[i].B),read(Li[i].dx),read(Li[i].C),read(Li[i].D),read(Li[i].dy),read(Li[i].w); Add(1,L,R,i); } while(!Q.empty())Q.pop(); Extend(sx,sy,0); while(!Q.empty()) { pair<int,int>t=Q.top();Q.pop(); int x=t.second,y=t.first,a=Li[x].A,b=Li[x].B,dx=Li[x].dx,dy=Li[x].dy,c=Li[x].C,d=Li[x].D; for(int i=a;i<=b;i+=dx) for(int j=c;;) { j=F(i,j); j=((j-c)/dy+((j-c)%dy>0))*dy+c; if(j>d)break; Extend(i,j,y); } } for(int i=1;i<=n*m;i++)printf("%d%c",Dis[i],i<n*m?' ':'\n'); } return 0;}
0 0
- HDU 5910Advanced Traffic System
- [最短路] HDU 5910 Advanced Traffic System
- 【HDU】5910 Advanced Traffic System【线段树+并查集】【数据结构模拟最短路】
- HDU Traffic Real Time Query System
- UVALive 4839 HDU 3686 Traffic Real Time Query System
- UVALive 4839 HDU 3686 Traffic Real Time Query System
- lightoj1210Efficient Traffic System
- Linux Advanced Routing and Traffic Control HOWTO
- Linux Advanced Routing & Traffic Control HOWTO
- Linux Advanced Routing & Traffic Control HOWTO
- Linux Advanced Routing & Traffic Control HOWTO
- Linux Advanced Routing & Traffic Control HOWTO
- HDU 3686 Traffic Real Time Query System(点双连通缩点 + LCA)
- 【HDU】3686 Traffic Real Time Query System 点双连通+LCA
- Hdu 3686 Traffic Real Time Query System(双联通分量+LCA)
- LightOJ 1210 Efficient Traffic System
- LightOJ - 1281 New Traffic System
- lightoj 1281 - New Traffic System
- JS-SDK使用权限签名算法
- java 多excel下载 打成zip压缩包 程序中创建文件 响应到浏览器(二)
- Java内部排序(四)-(交换排序法之快速排序+源码)
- 将表单提交的数据封装到T中
- 安卓屏幕单位
- HDU 5910Advanced Traffic System
- 编程规范
- NSLayoutConstraint小记
- Fragment与Activity的交互
- NoSQL浅谈
- 编程规范
- 网络编程 01
- nodejs-http
- ExtJS 布局系统详解