這個題一看和入度扯上關係就是明顯的topo了。
對於最優情況,直接維護小根堆,貪心即可。
對於最劣情況,顯然直接維護大根堆然後貪心是錯誤的(反例見luogu題解),所以每次要取出所有能拓展的節點,依次加入佇列topo即可。這裡注意當連到的點比當前最大值大時,壓入大根堆,
否則加入佇列。
code
#include#include#include#include#include#define maxn 500010
std::priority_queueq1;
std::priority_queueq2;
int n, m, res1, res2;
int head[maxn], cnt;
int in1[maxn], in2[maxn];
struct node edge[maxn];
class queue
inline int front(void)
inline void pop(void)
inline bool empty(void)
} q;
inline int read(void) while (ch < '0' || ch > '9');
do while (ch >= '0' && ch <= '9');
return f * x;
}inline int _max(int x, int y)
inline void add_edge(int x,int y)
void toposort1(void)
}return;
}void toposort2(void)
while(!q.empty())}}
}return;
}int main()
for (int i = 1; i <= n;++i)
if(!in1[i]) q1.push(-i), q2.push(i);
toposort1();
toposort2();
printf("%d\n%d\n", res1, res2);
return 0;
}
洛谷P5603 小C與桌遊
題目鏈結 小c是乙個熱愛桌遊的高中生,現在他被乙個桌遊難住了,快來幫幫他!這個桌遊的地圖可以被抽象成乙個 n 個點,m 條邊的有向無環圖 不保證連通 小c在這個地圖上行走,小c能走到某個點當且僅當能夠到達這個點的所有點都已經被小c走到。小c會走到每個點恰好 1 次,並且他能走到哪些點與他當前所在的點...
拓撲排序 貪心 小C與桌遊(洛谷 P5603)
題目描述 這個桌遊的地圖可以被抽象成乙個 n 個點,m 條邊的有向無環圖 不保證連通 小c在這個地圖上行走,小c能走到某個點當且僅當能夠到達這個點的所有點都已經被小c走到。小c會走到每個點恰好 1 次,並且他能走到哪些點與他當前所在的點沒有關係 即可以走到與當前所在的點沒有連邊的點,只要滿足之前的條...
洛谷10月月賽 III 小C與桌遊
該問題可以分為兩個子問題 1.求一種拓撲順序使點的編號最大值的更新次數最多。2.求一種拓撲順序使點的編號最大值的更新次數最少。對於第乙個子問題,我們貪心的想,每次走到所有能走的點中編號最小的點。這種貪心顯然是正確的,因為如果我們先走編號較大的點,再走編號較小的點,顯然不如先走編號較小的點更優一些。所...