【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
生活随笔
收集整理的這篇文章主要介紹了
【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【BZOJ1880】[Sdoi2009]Elaxia的路線
Description
最近,Elaxia和w**的關系特別好,他們很想整天在一起,但是大學的學習太緊張了,他們 必須合理地安排兩個人在一起的時間。Elaxia和w**每天都要奔波于宿舍和實驗室之間,他們 希望在節約時間的前提下,一起走的時間盡可能的長。 現在已知的是Elaxia和w**所在的宿舍和實驗室的編號以及學校的地圖:地圖上有N個路 口,M條路,經過每條路都需要一定的時間。 具體地說,就是要求無向圖中,兩對點間最短路的最長公共路徑。Input
第一行:兩個整數N和M(含義如題目描述)。 第二行:四個整數x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ ≤ N),分別表示Elaxia的宿舍和實驗室及w**的宿舍和實驗室的標號(兩對點分別 x1,y1和x2,y2)。 接下來M行:每行三個整數,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之間有一條路,經過這條路所需要的時間為l。 出出出格格格式式式::: 一行,一個整數,表示每天兩人在一起的時間(即最長公共路徑的長度)。Output
一行,一個整數,表示每天兩人在一起的時間(即最長公共路徑的長度)Sample Input
9 101 6 7 8
1 2 1
2 5 2
2 3 3
3 4 2
3 9 5
4 5 3
4 6 4
4 7 2
5 8 1
7 9 1
Sample Output
3HINT
對于30%的數據,N ≤ 100;
對于60%的數據,N ≤ 1000;
對于100%的數據,N ≤ 1500,輸入數據保證沒有重邊和自環。
題解:先從x1,y1,x2都跑一邊最短路,這樣我們就可以快速判斷一條邊是否在最短路上了。最后從y2跑最短路,然后用f[x]表示從y2走到x時最長公共路徑的長度。邊最短路邊DP即可。
然而好像被hack了。。。還是看大爺的題解吧。
#include <cstring> #include <cstdio> #include <iostream> #include <queue> #include <utility> #define mp(A,B) make_pair(A,B) using namespace std; typedef pair<int,int> pii; int n,m,cnt,S1,S2,T1,T2,la,lb; int to[1000010],next[1000010],val[1000010],head[10010],dis[4][10010],vis[10010],f[10010]; priority_queue<pii> q; inline int rd() {int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();return ret*f; } void dijkstra(int S,int t) {int i,u;memset(vis,0,sizeof(vis));dis[t][S]=0,q.push(mp(0,S));while(!q.empty()){u=q.top().second,q.pop();if(vis[u]) continue;vis[u]=1;for(i=head[u];i!=-1;i=next[i]) if(dis[t][to[i]]>dis[t][u]+val[i])dis[t][to[i]]=dis[t][u]+val[i],q.push(mp(-dis[t][to[i]],to[i]));} } inline void add(int a,int b,int c) {to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++; } int main() {n=rd(),m=rd(),S1=rd(),T1=rd(),S2=rd(),T2=rd();int i,a,b,c,u,v;memset(head,-1,sizeof(head));for(i=1;i<=m;i++) a=rd(),b=rd(),c=rd(),add(a,b,c),add(b,a,c);memset(dis,0x3f,sizeof(dis));dijkstra(S1,0),dijkstra(T1,1),dijkstra(S2,2),la=dis[0][T1],lb=dis[2][T2];memset(vis,0,sizeof(vis));dis[3][T2]=0,q.push(mp(0,T2));while(!q.empty()){u=q.top().second,q.pop();if(vis[u]) continue;vis[u]=1;for(i=head[u];i!=-1;i=next[i]){v=to[i];if(dis[3][v]>dis[3][u]+val[i]){dis[3][v]=dis[3][u]+val[i],f[v]=0;q.push(mp(-dis[3][v],v));}if(dis[3][v]==dis[3][u]+val[i]){f[v]=max(f[v],f[u]+val[i]*((dis[1][u]+dis[0][v]+val[i]==la||dis[0][u]+dis[1][v]+val[i]==la)&&(dis[3][u]+dis[2][v]+val[i]==lb||dis[2][u]+dis[3][v]+val[i]==lb)));}}}printf("%d",f[S2]);return 0; }//3 2 1 2 1 3 1 2 1 2 3 1轉載于:https://www.cnblogs.com/CQzhangyu/p/7560065.html
總結
以上是生活随笔為你收集整理的【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Taro使用wxParse富文本组件
- 下一篇: POJ 3461Oulipo KMP模板