1. 程式人生 > >洛谷Oj-最短網路 Agri-Net-最小生成樹(模板題)

洛谷Oj-最短網路 Agri-Net-最小生成樹(模板題)

問題描述:
約翰已經給他的農場安排了一條高速的網路線路,他想把這條線路共享給其他農場。為了用最小的消費,他想鋪設最短的光纖去連線所有的農場。
你將得到一份各農場之間連線費用的列表,你必須找出能連線所有農場並所用光纖最短的方案。每兩個農場間的距離不會超過100000
AC程式碼:

int boss[110];
struct edge//最小生成樹要這樣建立結構體
{
    int x;
    int y;
    int w;
};
edge e[10010];
bool cmp(const edge &a,const edge &b)
{
    return a.w < b.w;
}
int
get_boss(int x) { if(boss[x] == x) return x; else return boss[x] = get_boss(boss[x]); } void merge(int x,int y) { int bx = get_boss(x); int by = get_boss(y); if(bx != by) boss[by] = bx; return; } bool query(int x,int y) { int bx = get_boss(x); int
by = get_boss(y); return bx == by; } int main() { int n,s = 1; cin >> n; for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) { int w; scanf("%d",&w); if(w == 0) continue; e[s].x = i; e[s].y = j; e[s].w = w; s++; } for
(int i = 1; i <= n; ++i) boss[i] = i; sort(e + 1,e + s,cmp); int sum = 0,cnt = 0; for(int i = 1; i <= s - 1; ++i) { if(query(e[i].x,e[i].y) == false) { merge(e[i].x,e[i].y); cnt++; sum += e[i].w; } if(cnt == n - 1) break; } printf("%d\n",sum); return 0; }

解決方法:
這次的最小生成樹模板比之前的美觀了許多,所以發上來作為今後的模板