先說求無向圖最小生成樹的兩種演算法:
①prim演算法
1.初始時兩個集合v,e,初始時v為空,e是所有點的集合。
2.以圖中任意乙個點為起始點,把這點加入集合v,然後從集合e中刪除,然後更新這個點到其它點的距離,如果更新不到的點,那麼之間的距離為無窮大。
3.然後挑選離起始點最近的點,把這點加入集合v,然後從集合e中刪除(有多個的話任選乙個),然後更新 新加入的點 到其它點的距離,然後再找出乙個距離這個集合最近的點(這個距離最近的點可能離起始點最近)。
4.然後重複上面的步驟,直至路被更新完或e為空,如果e不為空,說明圖不連通。
②克魯斯卡爾演算法
1.將兩點之間的距離排序
2.每次從中選出距離最短的兩點,判斷這兩點所在的集合是否聯通。
3.如果聯通,繼續步驟2;如果不連通,將兩點合併為乙個集合,繼續步驟2
4.直至所有點都聯通,或路徑判斷完畢
其中稠密圖適合用prim,稀疏圖適合用克魯斯卡爾。
兩個演算法的基礎都是貪心演算法,下面的水題,練練手。。。
hdu 1102 constructing roads
題目大意:給你乙個矩陣map,其中map[i][j]表示從i到j的花費,給你多次詢問,輸出詢問的兩點之間聯通的最小花費
**如下:
#include#include#includeusing namespace std;
#define maxint 0x3f3f3f3f
#define n 110
int map[n][n],visit[n],low[n];
int n,m;
int prim()
return sum;
}int main()
scanf("%d",&m);
int a,b;
for(int i=1;i<=m;i++)
printf("%d\n",prim());
}return 0;
}
hdu 1863 暢通工程
題目大意:中文題,不解釋
**如下:
#include#include#includeusing namespace std;
#define maxint 0x3f3f3f3f
#define n 110
int n,m,rank,map[n][n],sum,f[n];
//克魯斯卡爾
struct point//結構體的初始化
}s[n];
bool cmp(point a,point b)
return 0;
}
hdu 1875 暢通工程再續
**如下:
#include#include#include#includeusing namespace std;
#define maxint 0x3f3f3f3f
#define n 110
//prim
int visit[n],n;
double low[n],map[n][n];
struct points[n];
void init()//初始化
return sum;
}double s(point a,point b)//兩座標之間距離
int main()
double ans=prim();
if(ans==-1) printf("oh!\n");
else printf("%.1lf\n",ans);
}return 0;
}
hdu 1879 繼續暢通工程
**如下:
#include#include#include#includeusing namespace std;
#define maxint 0x3f3f3f3f
#define n 110
//prim
struct points[100005]; //注意s的範圍
int visit[n],n,low[n],map[n][n];
void init()
return sum;
}int main()
}int prim()
return sum;
}int main()
for(int i=1;i<=k;i++)
s[100005];
bool cmp(point a,point b)
void init()
{ sum=0;
memset(visit,0,sizeof(visit));
for(int i=0;i關於有向圖的最小生成樹,應該是最小樹形圖,會在接下來整理。。。
最小生成樹(入門題)
time limit 1000ms memory limit 65536k 有疑問?點這裡 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸入包含多組資料,格式如下。第一行...
並查集(最小生成樹)
時間限制 1000 ms 記憶體限制 65536 kb 題目描述 有一張城市地圖,圖中的頂點為城市,無向邊代表兩個城市間的連通關係,邊上的權為在這兩個城市之間修建高速公路的造價,研究後發現,這個地圖有乙個特點,即任一對城市都是連通的。現在的問題是,要修建若干高速公路把所有城市聯絡起來,問如何設計可使...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...