題目給出的是一張圖,在圖上有很多演算法無法實現,所以要將其轉化為樹
題中可以發現貨車的最後的載重量是由權值最小的一條邊決定的,所以我們求最大生成樹
求完最大生成樹後我們得到乙個森林
現在轉化為了求兩點路徑經過邊的邊權的最小值,用倍增演算法進行計算
#include #define inf 1e9using
namespace
std;
const
int maxn=10100
;int n,m,first[maxn],nxt[maxn*10],point[maxn*10],len[maxn*10
];int q,tot,fa[maxn],f[maxn][21],chmin[maxn][21
],vi[maxn],de[maxn];
struct
node
sh[maxn*5
];void add_edge(int x,int y,int
z)void dfs(int x,int father,int deep,int last,int
visit)
}}int getfather(int
x)bool
cmp(node a,node b)
int lca(int a,int
b)//倍增求lca
}if (a==b)
return
min;
for (int i=20;i>=0;i--)
}min=min(min,min(chmin[a][0],chmin[b][0
]));
return
min;
}int
main()
for (int i=1;i<=n;i++)
fa[i]=i;
sort(sh+1,sh+1+m,cmp);
for (int i=1;i<=m;i++)
}//求最大生成樹
int now=0
;
for (int i=1;i<=n;i++)//可能有多棵樹,每棵樹分別考慮
for (int j=1;j<=20;j++)
}scanf("%d
",&q);
for (int i=1;i<=q;i++)
}
倍增求lca時避免父親倍增陣列出現0,倍增記錄最小值時,簡單寫法
int now=0;
for (int i=1;i<=n;i++)
求deep時,注意不是求距離上的deep,而是層數
void dfs(int x,int father,int deep,int last,intvisit)
}}
Luogu P1967 NOIP2013 貨車運輸
這個題是很經典的生成樹問題。第一次接觸時對倍增演算法的理解還不夠透徹,沒能打出來正解。首先,原題中給出的是一幅圖,詢問從某點出發到另一點 需要經過的最短邊的最大值 用floyd來解決是可以的,但是資料範圍不能承受o n 3 的複雜度。於是我們考慮 假設原圖是連通的,那麼我們從某點到另一點,一定至少存...
P1967 貨車運輸
題目 題目描述 aa國有n n座城市,編號從 1 1到 nn,城市之間有 mm 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 qq 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入格式 第一行有兩個用乙個空格隔開的整數 n,mn,m,表示 aa 國...
P1967 貨車運輸
a 國有 n 座城市,編號從 1 到 n 城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。第一行有兩個用乙個空格隔開的整數 n m 表示 a 國有 n 座城市和 m 條道路。接下來 m ...