到了難得的暑假,為了慶祝小白在數學考試中取得的優異成績,小藍決定帶小白出去旅遊~~
經過一番抉擇,兩人決定將t國作為他們的目的地。t國的國土可以用乙個凸n邊形來表示,n個頂點表示n個入境/出境口。t國包含n-2個城市,每個城市都是頂點均為n邊形頂點的三角形(換而言之,[b]城市組成了關於t國的乙個三角剖分[/b])。[b]兩人的旅遊路線可以看做是連線n個頂點中不相鄰兩點的線段[/b]。
為了能夠買到最好的紀念品,小白希望旅遊路線上經過的城市盡量多。作為小藍的好友,你能幫幫小藍嗎?
輸入格式:
每個輸入檔案中僅包含乙個測試資料。
第一行包含兩個由空格隔開的正整數n,n的含義如題目所述。
接下來有n-2行,每行包含三個整數 p,q,r,表示該城市三角形的三個頂點的編號(t國的n個頂點按順時間方向從1至n編號)。
輸出格式:
輸出檔案共包含1行,表示最多經過的城市數目。([b]乙個城市被當做經過當且僅當其與線路有至少兩個公共點[/b])
輸入樣例#1:
61 2 4
2 3 4
1 4 5
1 5 6
輸出樣例#1:
對於20%的資料, n<=2000
對於100%的資料, 4<=n<=200000
一句話題意:給出乙個 奇奇怪怪的(??) 多邊形,其中每\(3\)條邊圍成乙個城市,每兩個相連的城市中有一條邊,問從任意乙個城市出發不重複經過某個城市最多能經過多少個城市.
題解:首先對於這種奇奇怪怪的題目,我們需要將它轉化模型.很顯然這個連通關係可以將它轉化成乙個圖論問題.對於這個建邊,有一點小技巧,比如我們發現一條邊只會連通兩個城市,並且一條邊一定是由多邊形上的兩個頂點確定的.所以我們可以將一條邊的兩個頂點的存入乙個結構體內,並用\(map\)記錄第一次與這條邊接觸的城市是哪乙個.這樣如果遍歷到乙個有值的邊,就可以直接建邊了.
然後我們需要思考這個建出來的圖都有些什麼性質.乙個城市是乙個三角形,那麼顯然它最多與三個城市連邊,並且在邊界上的城市是不會有三個城市與它相連的.並且在圖中不會存在環,也就是兩個三角形不可能有超過一條邊的公共邊.
那麼知道這些性質了,我們就會發現它是一棵樹,並且如果以邊界為根的話,它還是一顆二叉樹.
在樹上找一條最長的路徑,顯然就是求樹的直徑,直接跑一遍\(dfs\)求出直徑就可以了.
#includeusing namespace std;
const int n = 200000+5;
int n, ecnt = 0, last[n], ans = 0, f[n];
struct edgee[n*2];
struct line
};map vis;
void add(int x, int y, int z)
void dfs(int x, int fa)
}int main()]) add(i, vis[(line)], 1), add(vis[(line)], i, 1);
else vis[(line)] = i;
if(vis[(line)]) add(i, vis[(line)], 1), add(vis[(line)], i, 1);
else vis[(line)] = i;
if(vis[(line)]) add(i, vis[(line)], 1), add(vis[(line)], i, 1);
else vis[(line)] = i;
}dfs(1, -1);
cout << ans+1 << endl;
return 0;
}
洛谷 P2607 ZJOI2008 騎士
給出一幅有n個點,n條邊的無向未必聯通圖,每乙個點有乙個權並與另外乙個點相連,對其中一些點進行染色,且相鄰兩點的顏色不能都染,則最大的染色點權值和是多少.這題和 洛谷p1453城市環路 很像,區別就在於它不是連通圖.因而可以先用並查集和vector進行分塊,易證每一塊都是比樹多一條邊的連通圖,每一塊...
洛谷 P2577 ZJOI2005 午餐
這道題目比較難想。演算法 貪心 dp 容易想到貪心 吃飯慢的先打飯節約時間,所以先將人按吃飯時間從大到小排序。然後就是dp了 首先,應該想到f i j k 前i個人,在1號視窗打飯總時間j,在2號視窗打飯總時間k 當然,這樣會爆空間,所以想到去掉一維。f i j 表示前i個人,在1號視窗打飯總時間j...
洛谷P2577 ZJOI2005 午餐
挺棒的一道dp。貪心策略容易想到。直接按吃飯時間從大到小排序即可。重點是dp。可以設方程為 f 前 i 人 佇列1的時間 j 然後加上乙個常見的滾動陣列套路。方程的轉移還是很有意思。include include include include using namespace std const i...