2017 江蘇省賽JSCPC H 貪心,prim

2021-08-01 03:57:11 字數 1960 閱讀 3445

給你一棵樹,兩兩節點間有乙個距離ci

c

i,現在要重建地圖,任意兩個頂點間的花費是他們之間的最短路,建最大生成樹求花費.

這題比賽的時候沒有做出來,賽後看題解原來很簡單,想象prim的建樹過程每次找剩餘邊集合中的最大距離.顯然我們首先找到直徑v0

,v1 v0,

v1

肯定作為第一條邊然後照剩餘點,對於剩下的每個點他要莫加到v0

,要莫加

到v1 v0,

要莫加到

v1

,因為可以證明他到任意點的距離不會超過ma

x(di

st(v

,v0)

,dis

t(v,

v1))

m ax

(dis

t(v,

v0),

dist

(v,v

1)

),可以用反正法來證明這個結論因為v0

,v1 v0,

v1

是直徑

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define pb push_back

#define mp make_pair

#define pi acos(-1)

#define fi first

#define se second

#define inf 0x3f3f3f3f

#define inf64 0x3f3f3f3f3f3f3f3f

using

namespace

std;

const

int mod = 1e9+7;

const

int max_p = 2e4+10;

const

int maxn = 1e5+10;

const

int max_v = 5e5+10;

const

double eps = 1e-8;

typedef

long

long ll;

typedef

long

double db;

typedef pair pair;

struct edge;

edge e[maxn*2];

int ne;

std::vector

g[maxn];

void add_edge(int u,int v,int cost);

g[u].pb(ne-1);

e[ne++] = edge;

g[v].pb(ne-1);

}ll d[2][maxn];

bool vis[maxn];

void bfs(int s,ll *dist)}}

}int main()

ll ans =0;

bfs(1,d[0]);

int v0 = 1;

for(int i=1 ; i<=n ; ++i)

if(d[0][v0] < d[0][i])v0 = i;

bfs(v0,d[0]);

int v1 = 1;

for(int i=1 ; i<=n ; ++i)

bfs(v1,d[1]);

ans = d[0][v1];

for(int i=1 ; i<=n ; ++i)

}//std::cout << v0<<" " << v1 << '\n';

printf("%lld\n",ans );

}return

0;}

2017江蘇省賽賽後感想

江蘇省賽感想 凌曉此次江蘇省賽,心情比較激動,a題時頭腦不是很清醒,很冷靜,但是組織安排還是比較合理,a題本來以為是水題,但看完題目以後覺得不簡單,於是,此時沒有過多的去糾結a題,隊友們果斷跟榜,a出兩題。我在一邊想a題,後來覺得自己演算法會t就放棄了。然後一起在想h,e題,h題一開始有點想法,但是...

2018江蘇省賽G題(hdu6282)

hdu6268 題意 給你aa,bb,abab這樣的三個字串,和兩個字串s,t,讓你在t中任意刪除或者插入任意多個aa,bb,abab,最後得到t。題解 思維題,簡單手畫畫就可以得出乙個結論,aa,bb,abab,可以得到任意由,a和b組成的且a和b的個數為都為偶數個的字串。這樣s可以變成t就要求c...

江蘇省 領航杯部分wp

只能說這比賽平台 題目 簡單記錄一下,畢竟自己也做了好久 開啟程式是下黑白棋,要戰勝ai才能獲得flag。利用ollydebug開啟,找到跳入,單步步入真正的程式,然後中文搜尋得到flag。利用ida開啟能夠很清楚的看明白邏輯,encode函式和judgement函式都是註明了的。base加密自定義...