日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

發布時間:2023/12/20 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 10
1 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

3

HINT

對于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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。