CJOJ 免費航班

2022-08-02 12:36:14 字數 1950 閱讀 2984

小z在moi比賽中獲得了大獎,獎品是一張特殊的機 票。使用這張機票,可以在任意乙個國家內的任意城市之間的免費飛行,只有跨國飛行時才會有額外的費用。小z獲得了一張地圖,地圖上有城市之間的飛機航班和 費用。已知從每個城市出發能到達所有城市,兩個城市之間可能有不止乙個航班。乙個國家內的每兩個城市之間一定有不止一條飛行路線,而兩個國家的城市之間只 有一條飛行路線。小z想知道,從每個城市出發到額外費用最大的城市,以便估算出出行的費用,請你幫助他。當然,你不能通過乘坐多次乙個航班增加額外費用, 也就是必須沿費用最少的路線飛行。

第一行,兩個整數n,m,表示地圖上有n個城市,m條航線。

接下來m行,每行三個整數a,b,c,表示城市a,b之間有一條費用為c的航線。

共n行,第i行為從城市i出發到達每個城市額外費用的最大值。

6 6

1 4 2

1 2 6

2 5 3

2 3 7

6 3 4

3 1 8

4 4

4 6 7 7

樣例說明

有四個國家,包含的城市分別為 ,,,。從城市1出發到達城市6,乘坐(1,3)(3,6)兩個航班費用最大,(1,3)在國內為免費航班,(3,6)的費用為4,所以從1出發的最大費用為4。

資料規模

對於30%的資料 1<=n<=1000,1<=m<=1000

對於100%的資料 1<=n<=20000,1<=m<=200000

動態規劃 ,連通性

根據題目描述,每個國家是乙個邊雙連通分量,把每個邊雙連通分量縮點後,原圖變為一棵樹.

相當於是求樹上每個點在樹上的最長路.

所有點的樹上最長路可以通過兩邊dfs進行dp;

第一遍:求出每個點只到他子樹內部的最長路和次長路

第二遍:每個點再由他父親來更新往改點的子樹外走的最長路,因為該點到子樹外面的路必經過他爸爸

具體實現就是最長路和次長路轉化,轉移畫畫圖就好了

邊雙連通縮點的話就是把橋標記後在dfs一遍

#include#include#include#include#include#define rg register

using namespace std;

typedef long long ll;

const int n=20050;

int gi()

int head[n],nxt[n*20],to[n*20],dfn[n],low[n],vis[n],zhan[n],w[n*20],cnt=1,tot,sum,top,pd[n*20];

vectorq[n],p[n],w[n];

int dis[n][2],vis2[n],fr[n];

void tarjan(int x,int fa)

else if(y!=fa) low[x]=min(low[x],dfn[y]);

}}void dfs3(int x,int gg)

}void dfs1(int x)

else dis[x][0]=max(dis[x][0],dis[y][1]+w);

} }

}void dfs2(int x)

else

dfs2(y);

} }

}int main()

tarjan(1,1);

for(int i=1;i<=n;i++) if(!vis[i]) dfs3(i,++tot);

for(rg int i=1;i<=tot;i++)

for(rg int j=0;jfor(rg int k=head[q[i][j]];k;k=nxt[k])

} dfs1(1);for(rg int i=1;i<=tot;i++) vis2[i]=0;

dfs2(1);for(rg int i=1;i<=n;i++) printf("%d\n",dis[fr[i]][1]);

return 0;

}

免費WIFI或成航班標配

飛機上使用wifi互聯已開始實現,未來幾年飛機免費wifi或成標配。近日,廈航部分航班向乘客免費開放機上wifi功能,而海航則表示未來兩年投入10億元改造100架飛機,實現wifi覆蓋。移動客戶端在手,並非隨時隨地聯網。登上飛機,意味著遠離網路。無線上網目前已經徹底融入了我們的生活,免費wifi成為...

CJOJ 為了博多

做了個噩夢,夢見我的 n 把刀到60級會二次變身,變成乙個對推6圖有xi點貢獻,刷大阪城有yi點貢獻的刀,於是要把刀分成兩隊一隊刷大阪城另一隊推6圖 但是有m對兄弟刀在同一隊會有特殊的buff加成,加成值為wi,問怎樣分隊收益最大,最大值是多少。第一行兩個整數n 刀的數目 0 n 20000 m 兄...

CJOJ 1504 整數合併

現在給你一些連續的整數,它們是從 a 到 b 的整數。一開始每個整數都屬於各自的集合,然後你需要進行如下操作 每次選擇兩個屬於不同集合的整數,如果這兩個整數擁有大於等於 p 的公共質因子,那麼把他們所在的集合合併。反覆上述操作,直到沒有可以合併的集合為止。現在,小 x 想知道,最後有多少個集合。一行...