2017 湘潭大學邀請賽H題 Highway

2021-08-04 20:20:02 字數 1699 閱讀 7383

題目傳送門

賽後感慨:

大一的我,去參加湘潭大學邀請賽還是比較興奮的,我知道自己學校的實力並不強,所以並沒有抱著能拿獎的心態去的,當時的我對於acm也只是盲目的熱愛,因為這次湘潭大學邀請賽,也讓我看到了自己學校與其他學校的真正差距,也明白了自己究竟想要什麼;我想要的是能為學校拿獎(也為自己),能讓自己足夠的強。

比賽期間看著旁邊的隊氣球越來越多,我隊的氣球卻還是兩個,當時的心情…。這個題目當時我肯定做不出來,當時我圖論乙個知識點都沒有看過,暑假集訓二十多天裡,因為自己是負責隊裡圖論方面,也接觸了樹的直徑,所以現在這個題目也可以輕鬆的解決;今年暑假好好努力準備省賽吧!

思路分析:

我先從1節點搜尋到距離最遠的直徑上的節點node[0],然後再從node[0]搜尋找到距其最遠的節點node[1],也就是另乙個直徑節點,同時更新每乙個點到node[0]的距離,再從node[1]進行搜尋更新每乙個點到直徑節點node[1]的距離,然後每個點到直徑節點的最大距離進行累加。因直徑考慮了兩次,故減去一次直徑就是最後的答案,三次搜尋即可。

ac**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define f(i,n) for(int i=1;i<=n;i++)

#define mem(a,x) memset(a,x,sizeof(a))

typedef

long

long ll;

typedef pair<

int,ll>p;

const ll inf=

-9999999999

;//距離初始為負數,並不是求最短路,而是更新更遠的距離

const

int maxn=

100000+10

;ll dis[3]

[maxn]

;//儲存三次bfs產生的距離,只需要對後兩組距離進行選擇

int n,m;

vectorg[maxn]

;//存邊

bool vis[maxn]

;//判斷點是否標記過

int node[2]

;//儲存樹的直徑兩節點

ll max;

void

bfs(

int u,

int t)

//u為搜尋的點,t為第幾次bfs搜尋 }}

}}intmain()

bfs(1,

0);//尋找第乙個樹的直徑節點

bfs(node[0]

,1);

//尋找第二個樹的直徑節點,並且更新每個點到此節點的距離

bfs(node[1]

,2);

//求每個點到第二個樹的直徑節點的距離

ll sum=0;

f(j,n)

printf

("%i64d\n"

,sum-max)

;//因直徑考慮了兩次,故減去一次直徑

}return0;

}

湘潭邀請賽A

哥德 猜想 任一大於2的偶數,都可表示成兩個素數之和。是世界上最著名的未解問題之一,但是下面的反哥德 猜想 任一大於11的奇數,都可表示成兩個合數之和。確很容易證明。定義反哥德 分拆數g n 表示將大於11的奇數n分解為兩個合數之和的方案數。再定義sg n sum 即所有不大於n的奇數的反哥德 分拆...

湘潭邀請賽 Hamiltonian Path

湘潭邀請賽的c題,哈密頓路徑,邊為有向且給定的所有邊起點小於終點,怎麼感覺是腦筋急轉彎?以後一定要牢記思維活躍一點,把複雜的事情盡量簡單化而不是簡單的事情複雜化。include include include include include include include include inclu...

2015 湘潭邀請賽 Tuples

很好的一道dp題!題意 給出n,m,問存在多少種方案,滿足a 1 a 2 a m n,且a 1 a 2 a m 思路 因次數是遞增的,且全是正數,因此m m 1 2 n,一旦不滿足不等式,結果必為0.同時,在這條式子的限制下,m不會大於446 將a i i 1 則每個數變成了非遞減,即a 1 a 2...