【bzoj3575】 Hnoi2014—道路堵塞
生活随笔
收集整理的這篇文章主要介紹了
【bzoj3575】 Hnoi2014—道路堵塞
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://www.lydsy.com/JudgeOnline/problem.php?id=3575?(題目鏈接)
題意
給出一個有向圖和一條最短路,問最短路上任意一條邊斷掉,此時的最短路是多少。
Solution
聽說這道題正解被江哥插了。。。右轉題解→_→:lmy學長
平衡樹用堆就可以了。
細節
用棧來存要加入堆中的點,不然不好消除標記。
代碼
// bzoj3575 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define LL long long #define inf (1ll<<60) #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std;const int maxn=200010; int head[maxn],dis[maxn],vis[maxn],st[maxn],in[maxn]; int n,m,L,cnt,id[maxn],ord[maxn],suf[maxn]; struct edge {int from,to,next,w;}e[maxn<<1]; struct data {int num,len;friend bool operator < (const data a,const data b) {return a.len>b.len;} }; priority_queue<data> T;inline void link(int u,int v,int w) {e[++cnt]=(edge){u,v,head[u],w};head[u]=cnt; } inline void SPFA(int u,int v,int k) {queue<int> q;q.push(u);int top=0;while (!q.empty()) {int x=q.front();q.pop();vis[x]=0;for (int i=head[x];i;i=e[i].next) if (i!=k) {if (ord[e[i].to]>ord[u]) {dis[e[i].to]=min(dis[e[i].to],dis[x]+e[i].w);if (!in[e[i].to]) in[e[i].to]=1,st[++top]=e[i].to;}else if (dis[e[i].to]>dis[x]+e[i].w) {dis[e[i].to]=dis[x]+e[i].w;if (!vis[e[i].to]) vis[e[i].to]=1,q.push(e[i].to);}}}for (int i=1;i<=top;i++) {T.push((data){ord[st[i]],suf[st[i]]+dis[st[i]]});in[st[i]]=0;} } int main() {scanf("%d%d%d",&n,&m,&L);for (int u,v,w,i=1;i<=m;i++) {scanf("%d%d%d",&u,&v,&w);link(u,v,w);}ord[1]=1;for (int i=1;i<=L;i++) scanf("%d",&id[i]),ord[e[id[i]].to]=i+1;for (int i=L;i>=1;i--) suf[e[id[i]].from]=suf[e[id[i]].to]+e[id[i]].w;memset(dis,0x7f,sizeof(dis));dis[1]=0;for (int i=1;i<=L;i++) {int u=e[id[i]].from,v=e[id[i]].to;SPFA(u,v,id[i]);while (!T.empty() && T.top().num<ord[v]) T.pop();printf("%d\n",T.empty() ? -1 : T.top().len);dis[v]=dis[u]+e[id[i]].w;}return 0; }?
轉載于:https://www.cnblogs.com/MashiroSky/p/6440116.html
總結
以上是生活随笔為你收集整理的【bzoj3575】 Hnoi2014—道路堵塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-存储过程实现更改用户密码
- 下一篇: 在Ubuntu 14.04 TLS下op