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,表示 ...