洛谷Oj-最短網路 Agri-Net-最小生成樹(模板題)
阿新 • • 發佈:2019-02-01
問題描述:
約翰已經給他的農場安排了一條高速的網路線路,他想把這條線路共享給其他農場。為了用最小的消費,他想鋪設最短的光纖去連線所有的農場。
你將得到一份各農場之間連線費用的列表,你必須找出能連線所有農場並所用光纖最短的方案。每兩個農場間的距離不會超過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;
}
解決方法:
這次的最小生成樹模板比之前的美觀了許多,所以發上來作為今後的模板