1. 程式人生 > >POJ1258 Agri-Net【最小生成樹】

POJ1258 Agri-Net【最小生成樹】

ios rim def define sin pri ret fine 輸出

題意:

有n個農場,已知這n個農場都互相相通,有一定的距離,現在每個農場需要裝光纖,問怎麽安裝光纖能將所有農場都連通起來,並且要使光纖距離最小,輸出安裝光纖的總距離。

思路:

又是一個最小生成樹,因為給出了一個二維矩陣代表他們的距離,直接算prim就行了。

代碼:

#include <iostream>
using namespace std;

#define maxn 105
#define inf 0x3f3f3f3f

int map[maxn][maxn],n;

void Prim()
{
    int i,j,d[maxn],vis[maxn],mi,v;
    for
(i=1;i<=n;i++) { d[i]=map[1][i]; vis[i]=0; } for(i=1;i<=n;i++) { mi=inf; for(j=1;j<=n;j++) if(!vis[j] && d[j]<mi) { mi=d[j]; v=j; } vis[v]=1; for(j=1
;j<=n;j++) if(!vis[j] && d[j]>map[v][j]) d[j]=map[v][j]; } for(d[0]=0,i=1;i<=n;i++) d[0]+=d[i]; cout<<d[0]<<endl; } int main() { int i,j; while(cin>>n) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin
>>map[i][j]; Prim(); } return 0; }

POJ1258 Agri-Net【最小生成樹】