給你一棵樹,兩兩節點間有乙個距離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加密自定義...