acm模版
這個題用最小生成樹的兩個經典演算法都可以過,用 prim 演算法相對容易寫,只要再不斷擴充套件的過程中判定究竟是建站消耗高還是建管道高,如果用 kruskal 演算法的話,則需要在生成最小樹的過程中存樹,然後 dfs 一遍做和前者同樣的判定即可。
我用的是第二種,但是其實 kruskal 演算法還有更簡單的解法,只消建乙個超級源點即可,將所有站的建站消費都轉化為邊權連在超級源點上即可。
#include
#include
#include
#include
#include
using
namespace
std;
const
int inf = 0x3f3f3f3f;
const
int maxn = 333;
const
int maxm = 1e5;
intmap[maxn][maxn];
vector
tree[maxn];
int f[maxn];
struct edge
edge[maxm];
int tol;
int vis[maxn];
void init()
memset(vis, 0, sizeof(vis));
}void addedge(int u, int v, int w)
bool cmp(edge a, edge b)
int find(int x)
else
}int kruskal(int n)
sort(edge, edge + tol, cmp);
int cnt = 0;
int ans = 0;
for (int i = 0; i < tol; i++)
if (cnt == n - 1)
}if (cnt < n - 1)
else
}int ans;
int value[maxn];
void dfs(int root)
dfs(tmp);}}
}int main()
}vis[root] = 1;
for (int i = 0; i < n; i++)}}
ans = kruskal(n);
ans += minvalue;
dfs(root);
cout
<< ans << '\n';
}return
0;}
NYOJ123 士兵殺敵(四)
includeconst int n 1000002 struct tree tree tree n 2 void build int root,int l,int r void insert int root,int b,int e,int v int m tree root left tree ...
NYOJ 123士兵殺敵(四)
時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍麾下有百萬精兵,現已知共有m個士兵,編號為1 m,每次有任務的時候,總會有一批編號連在一起人請戰 編號相近的人經常在一塊,相互之間比較熟悉 最終他們獲得的軍功,也將會平分到每個人身上,這樣,有時候,計算他們中的哪乙個人到底...
nyoj 123 士兵殺敵 四
描述 南將軍麾下有百萬精兵,現已知共有m個士兵,編號為1 m,每次有任務的時候,總會有一批編號連在一起人請戰 編號相近的人經常在一塊,相互之間比較熟悉 最終他們獲得的軍功,也將會平分到每個人身上,這樣,有時候,計算他們中的哪乙個人到底有多少軍功就是乙個比較困難的事情,軍師小工的任務就是在南將軍詢問他...