NYOJ 1239 引水工程

2021-07-31 13:31:14 字數 1385 閱讀 5865

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,每次有任務的時候,總會有一批編號連在一起人請戰 編號相近的人經常在一塊,相互之間比較熟悉 最終他們獲得的軍功,也將會平分到每個人身上,這樣,有時候,計算他們中的哪乙個人到底有多少軍功就是乙個比較困難的事情,軍師小工的任務就是在南將軍詢問他...