發表文章

目前顯示的是有「生成樹」標籤的文章

[TIOJ] 1795. 咕嚕咕嚕呱啦呱啦

題目連結: http://tioj.infor.org/problems/1795 想了很久想不出來QQ,被雷了才知道其實就是求最小生成樹跟最大生成樹,然後判斷k是不是介在這兩棵樹的權值之間。證明也不難,就簡單的想一下你要從一棵生成樹變成另一棵生成樹,必定是加加減兩條邊,而且保證邊權都是0或1,所以其實每棵生成樹都最多差一(排序後),所以只要判是不是介在最大最小就好。 #include <bits/stdc++.h> using namespace std; typedef tuple<int,int,int> III; #define FF(x) get<0>(x) #define SS(x) get<1>(x) #define TT(x) get<2>(x) class DJS{ private: vector<int> arr; public: void init(int n){ arr.clear(); arr.resize(n); for(int i=0;i<n;i++) arr[i]=i; } int query(int x){ if(arr[x]!=x) arr[x]=query(arr[x]); return arr[x]; } void merge(int a, int b){ arr[query(a)]=query(b); } } mx, mi; vector<III> edges; int main(){ int n, m, k; cin>>n>>m>>k; mx.init(n+1); mi.init(...