題意:n個點修路,要求總長度最小,但是有兩個點p、q必須相連
思路:完全圖,prim演算法的效率取決於節點數,適用於稠密圖。用prim求解。
p、q間距離設為0即可,最後輸出時加上p、q間的距離
prim演算法:
#include#includeview code#include
#include
using
namespace
std;
#define inf 15000//
計算得最長值
#define maxn 128
bool
vis[maxn];
double
lowc[maxn];
struct
pointp[maxn];
double
dis(point a,point b)
double prim(double cost[maxn],int n)
if(minc==inf)return -1;//
原圖不連通
ans+=minc;
vis[p]=true
;
for(j=0;jj)
if(!vis[j]&&cost[p][j]
lowc[j]=cost[p][j];
}return
ans;
}int
main()
printf(
"%.2f\n
",prim(cost,n)+dis(p[a],p[b]));
}return0;
}
kruskal演算法的效率取決於邊數,適用於稀疏圖。
邊數為50*50,也不是很多,也可用kruskal演算法:
#include#includeview code#include
#include
#include
using
namespace
std;
#define maxn 110//
最大點數
#define maxm 10000//
最大邊數
int f[maxn];//
並查集使用
struct
pointp[maxn];
struct
edgeedge[maxm];
//儲存邊的資訊,包括起點/終點/權值
int tol;//
邊數,加邊前賦值為0
double
dis(point a,point b)
void addedge(int u,int v,double
w)//
排序函式,將邊按照權值從小到大排序
bool
cmp(edge a,edge b)
int find(int
x)//
傳入點數,返回最小生成樹的權值,如果不連通返回-1
double kruskal(int
n)
if(cnt==n-1)break
; }
if(cnt1)return -1;//
不連通return
ans;
}int
main()
printf(
"%.2f\n
",kruskal(n)+dis(p[a],p[b]));
}return0;
}
HDU4463Outlets(最小生成樹)
hdu4463outlets 最小生成樹 hdu4463outlets 題目大意 需要新建乙個mall,裡面有很多的商店,希望修最短的路,使得裡面的店聯通,可以通過別的店間接的聯通,但是有規定兩家店一定要直接的聯通。求在這樣的條件下的最短的路徑。解題思路 最小生成樹,只是前提是先要使得要求的兩個結點...
hdu 5017 模擬退火求最值
題意 給乙個橢圓 然後求原點到這個橢圓距離最小的點的距離是多少。解析 依舊用模擬退火。修改了乙個地方,初始溫度從100改到了1,就行了。之前的也修改了。選z的時候,選離遠點近的那個點就行了。pragma comment linker,stack 1677721600 include include ...
hdu 2795 找區間最值的位置
題目很好理解 我只寫了兩種一種是update和query合併的線段樹是參考的。還有是分開的最開始寫的 本來想寫樹狀陣列的但是一下子真沒想到區間最值的更新位置怎麼弄就先緩緩吧。希望有大牛可以指點 include include using namespace std define lson l m r...