具體思路:
最大生成樹 + 倍增lca
首先感謝tqc大佬為我的耐心修改**(你可能是改了個shi… …)
貼**using namespace std;
const int maxn = 100005;
const int maxm = 100005;
int n,m,head[maxn],father[maxn],top,depth[maxn],par[maxn][22],pre[maxn][22];
int ans = 1e9;
struct edge_pro ea[maxm<<1];
//題目要求的樹
struct edge e[maxm<<1];
//最大生成樹里的樹
bool cmp (edge_pro a,edge_pro b)
int find(int x)
void unionn (int r1,int r2)
void add_edge(int u,int v,int w)
void dfs(int u)
} void init()
}int lca(int x,int y)
if(x == y) return ans;
for(int j = log(n);j >= 0 ;–j)
if(par[x][j] != par[y][j])
ans = min(ans , min(pre[x][0] , pre[y][0]));
return ans;
}int main()
for(int i = 1;i <= n ;++i) father[i] = i;
sort(ea + 1,ea + m + 1,cmp);
int k = 0;
for(int i = 1;i <= m ;++i)
if(k == n - 1) break;
} //以上是生成樹的內容啦…
for(int i = 1;i <= n ;++i)
if(!depth[i])
init();
int q; scanf(「%d」,&q);
while(q–)
return 0;
}個人對這個題的理解就是
1. 這種題第一步就是要想到建兩個圖的問題(這已經是我第二次見這種題 感覺掌握的還可以一點)
2. 倍增lca的基本操作什麼的 比如說這個題裡的pre【i】【j】記錄的是從i點開始 2^j步路徑上的邊權最小值(可能有點繞口???)
洛谷1967 貨車運輸
to神犇 請自動跳過前 x行的吐槽,因為吐槽內容可能只是一些極其無聊的 bug和友情提示 codevs 上的資料略水 水了 8個點 洛谷資料和官方一致。題目描述 a 國有n 座城市,編號從1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司...
洛谷 1967 貨車運輸
在圖上從x到y找一條簡單路徑,使得路徑上最小值最大 暴力會t因為需要的是較大的那些邊,故可以求最大生成樹,然後lca陣列開小了 include include include define inf 0x3f3f3f3f define maxn 50005 using namespace std in...
洛谷 P1967 貨車運輸
a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 ...