Luogu P1967 貨車運輸

2022-05-19 22:17:05 字數 1405 閱讀 1411

p1967 貨車運輸

簡述題意:給定乙個圖,求兩點之間所有路徑上/最短邊最大的路一條路徑/的最短邊(突然繞 我應該表述複雜了)

做法:最大生成樹+樹上倍增

先跑一遍最大生成樹。可以證明答案一定在最大生成樹上。

建樹,樹上跑倍增\(lca\),取兩點路徑的\(min\)值就可以了w

#include #include #include #include #include #define maxn 10233

using namespace std;

struct qwq

a[523333];

struct qvq

e[523333];

int n,m;

int f[maxn];

int q;

int tot=0;

struct tree

fa[maxn][22];

int head[maxn],deep[maxn];

bool vis[maxn]={};

bool cmp(qwq x,qwq y)

int find(int x)

void add(int f,int t,int w)

void kruscal()

if (sum==n-1)

}}void dfs(int ed)

}int lca(int x,int y)

} if (x==y) return ans;

for (int i=20;i>=0;i--) }

ans=min(ans,min(fa[x][0].w,fa[y][0].w));

return ans;

}int main()

for (int i=1;i<=m;i++)

sort(a+1,a+m+1,cmp);

kruscal();

for (int i=2;i<=n;i++) }

for (int i=1;i<=20;i++) }

// debug

// for (int i=1;i<=tot;i++)

// // printf("\n");

// for (int i=1;i<=n;i++)

// // printf("\n");

// for (int i=1;i<=n;i++)

// // printf("\n");

// for (int i=1;i<=n;i++)

//

// printf("\n\n\n%d\n\n\n",fa[1][0].f);

scanf("%d",&q);

for (int i=1,xx,yy;i<=q;i++)

return 0;

}

luogu P1967 貨車運輸

題面傳送門 顯然不可以最長路。司機肯定喜歡走長的路徑,所以先把最大生成樹跑出來。然後再最大生成樹上跑倍增不就好了?實現 include include include define min a,b a b a b using namespace std int n,m,k,x,y,ans,flag ...

Luogu P1967 貨車運輸

現在開始正式填以前欠下的一些題解。就從這道經典的noip題開始講吧。我們仔細看題目,發現要求的是圖上兩點 u,v 之間的路徑上最小值的最大值。跑dp?圖上狀態太多了,單次要 o n 的複雜度,直接t飛。我們考慮一種經典方法 將圖轉化為一顆樹來做 由於樹保證聯通,而這裡要求最大化最小值,因此我們很容易...

luogu P1967 貨車運輸

a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 ...