題意:
在這些小島中建設最小花費的橋,但是一座橋的距離必須在10 -- 1000之間。
思路:用最小生成樹解決吧,就那兩個演算法。
**:prim
#include #includeview code#include
#include
using
namespace
std;
#define n 105
#define inf 0x3f3f3f3f
intn,i,j,x[n],y[n];
double
map[n][n];
bool vis[n];//
標記是否已經放入最小生成樹的那個集合裡了
double low[n];//
記錄不在已經加入最小生成樹的這個集合裡的元素到這個 集合的最小距離
double dis(int i,int
j)void
init()
}}void
prim()
vis[
1]=1
;
//已經找到乙個點1,再找n-1個
for(i=1;ii)
}if(min==inf)
sum+=min;
vis[pos]=1;//
把剛剛找到的這個點加入集合
for(j=1;j<=n;++j) //
更新low陣列}}
printf(
"%.1lf\n
",sum*100);}
intmain()
return0;
}
kruskal
#include#includeview code#include
using
namespace
std;
struct
island
;struct
node
;island arr[
220];
node edge[
20000
];int per[220
];int
n;bool
cmp(node a,node b)
void
init()
}int find(int
x)bool join(int x,inty)
return0;
}int
main()
//m=n*(n-1)/2;
k=0;
for(i=1;i<=n;++i)//
把所有路記錄在node結構體中
}
sort(edge,edge+k,cmp);
double sum=0
;
for(i=0;ii)
}int cnt=0
;
bool flag=0
;
for(i=1;i<=n;++i)//
短路了就不會執行了,也就不會連線了,就只需要判斷根節點的個數
}if(flag) printf("
oh!\n");
else
printf(
"%.1lf\n
",sum*100
); }
return0;
}
hdu 1875 暢通工程再續
題目 又是最小生成樹。一開始錯了幾次。我以為是當兩段路大於1000或者小於10就會不符合要求。其實是讀錯題意了。當兩段路大於1000或者小於10。只應該把這段路變成死路。下面是ac include includeusing namespace std define n 9999999 int n d...
HDU 1875 暢通工程再續
題目大意 其實就是求最小生成樹 不過唯一坑的地方在於只要求實現任意2個小島之間有路通即可,至少2個島連通 如果2個島不通才輸出oh 解題思路 標準的最小生成樹的模板 限制條件2島距離在10 1000公尺之間 普利姆演算法 include include include include include...
hdu1875 暢通工程再續
題目鏈結 此題是求最小生成樹的變形,需要從點和座標中抽象出邊的資訊,再利用kruskal求得最小生成樹,不過要注意邊是否符合要求,不然無法使用。看最後能否構成最小生成樹 include include include includeusing namespace std struct edge bu...