[BZOJ4289][PA2012]TAX(最短路)
2018-11-02 10:43
309 查看
首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点。若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值。这样跑最短路是$O(m^2\log m)$的。
用类似网络流中补流的方法,一条边拆成的两个点之间连权值为边的原权值的边(第一种边)。对于一个点,将所有以它为起点的边排序,将相邻的两条边对应的点连边,小的往大的连权值为两条边的原权值差的边,大的往小的连权值为0的边(第二种边)。建超级源汇,最短路即可。
若流了第一种边则代表最短路中有这条边,若流了第二种边则代表换边。复杂度$O(m\log m)$
#include<queue> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) #define For(i,x) for (int i=h[x],k; i; i=nxt[i]) typedef long long ll; using namespace std; const int N=1200010; const ll inf=1e15; ll dis ; bool b ; int n,m,u,v,w,cnt,nd,q ,h ,to ,nxt ,val ; struct E{ int u,v,w; }a ; vector<int>V ; bool cmp(int x,int y){ return a[x].w<a[y].w; } struct P{ int x; ll d; }; bool operator <(const P &a,const P &b){ return a.d>b.d; } priority_queue<P>Q; void add(int u,int v,int w){ to[++nd]=v; val[nd]=w; nxt[nd]=h[u]; h[u]=nd; } int main(){ scanf("%d%d",&n,&m); rep(i,1,m){ scanf("%d%d%d",&u,&v,&w); a[++cnt]=(E){u,v,w}; a[++cnt]=(E){v,u,w}; add(cnt,cnt-1,w); add(cnt-1,cnt,w); V[u].push_back(cnt-1); V[v].push_back(cnt); } rep(i,1,n){ int tot=0; rep(j,0,(int)V[i].size()-1) q[++tot]=V[i][j]; if (!tot) continue; sort(q+1,q+tot+1,cmp); rep(j,1,tot-1) add(q[j],q[j+1],a[q[j+1]].w-a[q[j]].w),add(q[j+1],q[j],0); } int S=cnt+1,T=cnt+2; rep(i,1,cnt){ if (a[i].u==1) add(S,i,a[i].w); if (a[i].v==n) add(i,T,a[i].w); } rep(i,1,T) dis[i]=inf; Q.push((P){S,0}); dis[S]=0; while (!Q.empty()){ int x=Q.top().x; Q.pop(); if (b[x]) continue; b[x]=1; For(i,x) if (dis[k=to[i]]>dis[x]+val[i]) dis[k]=dis[x]+val[i],Q.push((P){k,dis[k]}); } printf("%lld\n",dis[T]); return 0; }
相关文章推荐
- BZOJ 4289(PA2012 Tax-最短路)
- bzoj 4289: PA2012 Tax 最短路
- BZOJ 4289: PA2012 Tax(最短路)
- [BZOJ4289][PA2012]Tax(最短路)
- BZOJ 4289: PA2012 Tax 最短路 建图
- 【PA2012】【BZOJ4289】Tax
- 【PA2012】【BZOJ4289】Tax
- bzoj 4289: PA2012 Tax
- ●BZOJ 4289 PA2012 Tax
- bzoj 4289: PA2012 Tax(最短路+建图)
- BZOJ 4289: PA2012 Tax
- [BZOJ4289][PA2012]Tax
- bzoj 4289: PA2012 Tax
- 【bzoj 4289】PA2012 Tax (SPFA)
- BZOJ 4289 PA2012 Tax[Waiting]
- 【BZOJ】4289 PA2012 Tax
- 4289: PA2012 Tax
- 【BZOJ-4289】Tax 最短路 + 技巧建图
- bzoj 4289 Tax - 最短路
- 4289: PA2012 Tax