JSOI2013 旅行時的困惑

2022-05-02 02:06:13 字數 1244 閱讀 3258

傳送門

由於我們的圖不僅是乙個 \(\text\) 而且在形態上還是一棵樹,也就是說我們為了實現節點之間互相可達,就必須把每條邊都覆蓋一次,因為兩個點之間的路徑是唯一的。

那麼題意就變成了:每次在圖上選出一條路徑,覆蓋上面的邊,求最小的路徑數使得所有邊都被覆蓋至少一次。

看到這裡我不禁聯想起這道題

那麼對於這道題我們就讓源點 \(s\) 向所有點連上界為 \(+\infty\) ,下界為 \(0\) 的邊,所有點向匯點 \(t\) 連邊同理,然後原圖中的邊連成上界為 \(+\infty\) ,下界為 \(1\) 的邊,然後跑乙個有源匯上下界最小流即可。

由於這題資料範圍還是相對有點大的,所以建議把能加的優化都加上。

#include #include #define rg register

#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)

template < class t > inline t min(t a, t b)

template < class t > inline void read(t& s)

const int _ = 2e5 + 10, __ = 1e6 + 10, inf = 2147483647;

int tot = 1, head[_]; struct edge edge[__ << 1];

inline void add_edge(int u, int v, int w) , head[u] = tot; }

inline void link(int u, int v, int w)

int n, s, t, s, t, d[_], dep[_], cur[_];

inline void link(int u, int v, int l, int r)

inline int bfs()

}return dep[t] > 0;}

inline int dfs(int u, int flow) }}

return 0;}

inline int dinic()

return res;}

int main()

dinic();

link(t, s, inf);

dinic();

printf("%d\n", edge[tot].w);

return 0;

}

題解 JSOI2013 旅行時的困惑

首先我們要思考乙個問題,公交線路要加到什麼程度才能夠使得任意兩個點兩兩可達 很容易知道每個點和他的父親必須兩兩可達 所以最終所有公交線路新增的邊其實就是把原來的邊全部反向 那麼這些邊要如何組成公交線路呢,必須要滿足,在這條公交線路中,邊的指向相同,要麼都向上,要麼都向下,或者原來向上,在某個點轉成向...

JSOI2013 快樂的 JYY 題解

題面傳送門 我們一句話題意 求兩個字串的公共回文子串的數量 首先對於每個串構造乙個回文自動機,然後由pam的定義可知 對於pam上從根節點轉移方式相同所到達的點代表的回文串是相同的 這樣對於兩個pam同時dfs,每次dfs到的節點的數值 在其原串中的出現數量 相乘,然後累加到答案裡 注意 要從偶原點...

Jsoi2013 遊戲中的學問 解題報告

其實是很簡單的題,一開始想的有點麻煩了。一開始是這麼想的。f k,n i 3n n 1i 1 i 1 f k 1,n i i 3n n 1 n i f k 1,n i f k,n n 1n i 3nf k 1 n i n i 就是列舉第乙個人所屬的環長。但是其實不用這樣。f k,n n 1 n 2 ...