a國有n座城市,編號從1到n,城市之間有m條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。
現在有q輛貨車在運輸貨物, 司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。
求出這個圖的最大生成樹,這樣就把問題轉化為:樹上任意兩個點的路徑中,邊權值的最小值是多少,想到可以搜尋,單向搜尋比較慢,可以雙向搜尋,而樹上的雙向搜尋像極了lca,所以這道題就是最大生成樹+最近公共祖先。
**又臭又長,當我看到它將這道題ac的時候,我的內心是震驚的。
#include #include #include #include #include const int maxn = 10005;
struct edge1
edge1(int u, int v,int w):u(u), v(v), w(w){}
bool operator < (const edge1 x) const
} e1[maxn << 3];
struct edge2 e[maxn << 1];
int tot = 1, father[maxn], dep[maxn], fa[maxn], val[maxn], head[maxn];
int find(int x)
void union(int u, int v)
}void addedge(int u, int v, int w)
void kruskal(int nv, int ne)
int k = 0;
for (int i = 0; i < ne; i++) }}
}void bfs(int s) }}
}int lca(int u, int v)
int ans = 0x3f3f3f3f;
if (dep[u] > dep[v])
for (; dep[u] > dep[v];)
}// 兩個if為了防止到了最近公共祖先的時候還與最近祖先的父節點的距離取依次min
while (u != v)
return ans;
}void solve()
std::sort(e1, e1 + ne);
kruskal(nv, ne);
bfs(1);
scanf("%d", &nq);
for (int i = 0; i < nq; i++)
int ans = lca(u, v);
printf("%d\n", ans);
}}int main()
洛谷 P1967 貨車運輸
a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 ...
洛谷 P1967 貨車運輸
題目描述 a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入輸出格式 輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔...
貨車運輸 洛谷p1967
解法一 30分 直接跑spfa,求最大瓶頸路。include include include define f i,l,r for i l i r i using namespace std const int maxn 10005,maxm 50005,inf 100000000 struct e...