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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeVs1519 过路费

發布時間:2025/3/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeVs1519 过路费 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

題目描述?Description

? ? 在某個遙遠的國家里,有 n個城市。編號為 1,2,3,…,n。這個國家的政府修建了m 條雙向道路,每條道路連接著兩個城市。政府規定從城市 S 到城市T需要收取的過路費為所經過城市之間道路長度的最大值。如:A到B長度為 2,B到C 長度為3,那么開車從 A經過 B到C 需要上交的過路費為 3。
? ? 佳佳是個做生意的人,需要經常開車從任意一個城市到另外一個城市,因此他需要頻繁地上交過路費,由于忙于做生意,所以他無時間來尋找交過路費最低的行駛路線。然而, 當他交的過路費越多他的心情就變得越糟糕。 作為秘書的你,需要每次根據老板的起止城市,提供給他從開始城市到達目的城市,最少需要上交多少過路費。

輸入描述?Input Description

? ? 第一行是兩個整數 n 和m,分別表示城市的個數以及道路的條數。?
? ? 接下來 m 行,每行包含三個整數 a,b,w(1≤a,b≤n,0≤w≤10^9),表示a與b之間有一條長度為 w的道路。
? ? 接著有一行為一個整數 q,表示佳佳發出的詢問個數。?
? ? 再接下來 q行,每一行包含兩個整數 S,T(1≤S,T≤n,S≠T), 表示開始城市S 和目的城市T。

輸出描述?Output Description

? ? 輸出共q行,每行一個整數,分別表示每個詢問需要上交的最少過路費用。輸入數據保證所有的城市都是連通的。

樣例輸入?Sample Input

4 5?
1 2 10?
1 3 20?
1 4 100?
2 4 30?
3 4 10?
2?
1 4?
4 1

樣例輸出?Sample Output

20?
20

數據范圍及提示?Data Size & Hint

對于 30%的數據,滿足 1≤ n≤1000,1≤m≤10000,1≤q≤100;?
對于 50%的數據,滿足 1≤ n≤10000,1≤m≤10000,1≤q≤10000;?
對于 100%的數據,滿足 1≤ n≤10000,1≤m≤100000,1≤q≤10000;

?

@貨車運輸

先求出最小生成樹,再求LCA,順便倍增找路上最大值。

1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=300010; 9 //bas 10 int n,m; 11 //edge 12 struct li{ 13 int u,v,dis; 14 }line[mxn]; 15 int cmp(li a,li b){ 16 return a.dis<b.dis; 17 } 18 struct node{ 19 int v,dis; 20 int next; 21 }e[mxn]; 22 int hd[mxn],cnt; 23 // 24 //bc 25 int fa[mxn]; 26 void init(){ 27 for(int i=1;i<=n;i++)fa[i]=i; 28 } 29 int find(int x){ 30 if(fa[x]==x)return x; 31 return fa[x]=find(fa[x]); 32 } 33 //tree 34 int dep[mxn]; 35 int f[mxn][20]; 36 int w[mxn][20]; 37 // 38 void add_edge(int u,int v,int dis){ 39 e[++cnt].next=hd[u];e[cnt].dis=dis;e[cnt].v=v;hd[u]=cnt; 40 e[++cnt].next=hd[v];e[cnt].dis=dis;e[cnt].v=u;hd[v]=cnt; 41 } 42 void kruskal(){ 43 int i,j; 44 int tot=1; 45 for(i=1;i<=m;i++){ 46 int x=find(line[i].u),y=find(line[i].v); 47 if(x!=y){ 48 fa[x]=y; 49 tot++; 50 add_edge(line[i].u,line[i].v,line[i].dis); 51 } 52 } 53 } 54 void dfs(int u,int fafa){ 55 dep[u]=dep[fafa]+1; 56 f[u][0]=fafa; 57 int i,j; 58 for(i=hd[u];i;i=e[i].next){ 59 int v=e[i].v; 60 if(v==fafa)continue; 61 w[v][0]=e[i].dis; 62 dfs(v,u); 63 } 64 return; 65 } 66 void solve(){ 67 int i,j; 68 for(i=1;i<=n;i++)if(!dep[i]){ 69 dep[i]=1; 70 dfs(i,0); 71 } 72 for(j=1;j<=18;j++) 73 for(i=1;i<=n;i++){ 74 f[i][j]=f[f[i][j-1]][j-1]; 75 } 76 for(j=1;j<=18;j++) 77 for(i=1;i<=n;i++){ 78 w[i][j]=max(w[i][j-1],w[f[i][j-1]][j-1]); 79 } 80 81 } 82 int LCA(int x,int y){ 83 if(dep[x]<dep[y])swap(x,y); 84 int i; 85 for(i=18;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i]; 86 if(x==y)return x; 87 for(i=18;i>=0;i--) 88 if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; 89 return f[x][0]; 90 } 91 int mdis(int x,int rt){ 92 int d=dep[x]-dep[rt]; 93 int res=0; 94 for(int i=18;i>=0;i--) 95 if((d>>i)&1){ 96 res=max(res,w[x][i]); 97 x=f[x][i]; 98 } 99 return res; 100 } 101 int main(){ 102 scanf("%d%d",&n,&m); 103 int i,j; 104 int u,v,dis; 105 for(i=1;i<=m;i++) scanf("%d%d%d",&line[i].u,&line[i].v,&line[i].dis); 106 sort(line+1,line+m+1,cmp); 107 init(); 108 kruskal(); 109 solve(); 110 int q; 111 scanf("%d",&q); 112 int x,y; 113 for(i=1;i<=q;i++){ 114 scanf("%d%d",&x,&y); 115 if(find(x)!=find(y)){ 116 printf("-1\n"); 117 continue; 118 } 119 int rt=LCA(x,y); 120 if(rt==0){ 121 printf("-1\n"); 122 continue; 123 } 124 int ans=max(mdis(x,rt),mdis(y,rt)); 125 printf("%d\n",ans); 126 } 127 return 0; 128 }

?

轉載于:https://www.cnblogs.com/SilverNebula/p/5978148.html

總結

以上是生活随笔為你收集整理的CodeVs1519 过路费的全部內容,希望文章能夠幫你解決所遇到的問題。

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