http://courseware.ecnudec.com/zsb/zsx/zsx07/zsx079/main9/zsx079001.htmKruskalç®æ³åPrimç®æ³
ä»»ä½åªç±Gçè¾¹ææ,并å
å«Gçææ顶ç¹çæ 称为Gççææ (Gè¿é).
å ææ åå¾Gççææ ç代价æ¯è¯¥çææ çææè¾¹ç代ç (æ)çå.
æå°ä»£ä»·çææ æ¯å
¶ææçææ ä¸ä»£ä»·æå°ççææ .
åè代ç :
(ä»
为主ç¨åº,æ´å¤ä»£ç å¨
http://www.supcoder.cn/bbs/dispbbs.asp?boardID=1&ID=69&page=1 解åå¯ç :
www.supcoder.cn )
#include "Sets.h"
#include "themap.h"
#include "windows.h"
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
/*
åè½:
æ¼ç¤ºKruskalç®æ³åPrimç®æ³
éåç并,å
ç´ æ¥æ¾çæä½ååºç¨
说æ:
代ç åå¨vc++6.0ç¯å¢ä¸ç¼è¯åéè¿
å¨éVC++6.0ç¯å¢ä¸ç¼è¯è¯·å»æ头æ件 windows.h åå½æ° end()
å¦æNULLæªå®ä¹è¯·èªå®ä¹
#define NULL 0 æ
#define NULL ((void*)0)
ä½è
:
baihacker
æ¶é´:
2007.2.3
*/
const VSIZE = 7;//7个顶ç¹
const INFINITY = 10000;//10000ä½ä¸ºæ 穷大æ¥å¤ç
void LoadData(int cost[][VSIZE+1], Edge edge[]);
void end();
/*
å½æ°å:
Kruskal å Prim
åæ°:
è¾¹,代价,è¾¹æ°,顶ç¹æ°,æå°ä»£ä»·çææ ç顶ç¹
è¿åå¼:
è¿åå¼ä¸º-1,ä¸åå¨æå°ä»£ä»·çææ
è¿åå¼å¤§äº0æ¶ä¸ºæå°ä»£ä»·çææ ç代价
æå°ä»£ä»·çææ çè¾¹å¨vector<Edge>& t
*/
int Kruskal(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t);
int Prim (Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t);
int main()
{
int cost[VSIZE+1][VSIZE+1];//0ä¸ç¨
Edge edge[9];//9æ¡è¾¹
vector<Edge> t;//ç¨æ¥åå¨æå°ä»£ä»·çææ ç顶ç¹
int mincost;//æå°ä»£ä»·
LoadData(cost, edge);
if ( (mincost = Kruskal(edge, cost, 9, VSIZE, t))!=-1)
{
cout<<"æå°ä»£ä»·æ¯:"<<mincost<<endl<<"è¾¹æ¯:";
for (int i = 0;i<t.size();i++)
cout<<t[i];
cout<<endl;
}
t.clear();
if ( (mincost = Prim(edge, cost, 9, VSIZE, t))!=-1)
{
cout<<"æå°ä»£ä»·æ¯:"<<mincost<<endl<<"è¾¹æ¯:";
for (int i = 0;i<t.size();i++)
cout<<t[i];
cout<<endl;
}
end();
return 1;
}
void LoadData(int cost[][VSIZE+1], Edge edge[])
{
edge[0].u = 1; edge[0].v = 2; edge[0].weight = 28;
edge[1].u = 1; edge[1].v = 6; edge[1].weight = 10;
edge[2].u = 2; edge[2].v = 3; edge[2].weight = 16;
edge[3].u = 2; edge[3].v = 7; edge[3].weight = 14;
edge[4].u = 3; edge[4].v = 4; edge[4].weight = 12;
edge[5].u = 4; edge[5].v = 5; edge[5].weight = 22;
edge[6].u = 4; edge[6].v = 7; edge[6].weight = 18;
edge[7].u = 5; edge[7].v = 6; edge[7].weight = 25;
edge[8].u = 5; edge[8].v = 7; edge[8].weight = 24;
for (int i=1;i<=7;i++)
for (int j=1;j<=i;j++)
cost[i][j] = cost[j][i] = INFINITY;
for (i=0;i<9;i++)
cost[edge[i].u][edge[i].v] =
cost[edge[i].v][edge[i].u] = edge[i].weight;
}
int Kruskal(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t)
{
Sets s(esize);
priority_queue<Edge, vector<Edge>, EdgeGreater> pq;
int mincost = 0;
for (int i = 0;i<esize;i++)
//æææçè¾¹æ¾å
¥ä¼å
éå
pq.push(edge[i]);
i = 0;
while (i<vsize-1 && !pq.empty())
{
Edge temp = pq.top();//ååºå½åææå°çè¾¹
pq.pop();
int j = s.SimpleFind(temp.u);
int k = s.SimpleFind(temp.v);
if (j!=k)//å¦æä¸ææç¯
{
i++;
t.push_back(temp);
mincost +=cost[temp.u][temp.v];
s.SimpleUnion(j, k);
}
}
if (i!=vsize-1)
{
t.clear();
return -1;
}
else
{
return mincost;
}
}
int Prim(Edge edge[], int cost[][VSIZE+1], int esize, int vsize, vector<Edge>& t)
{
priority_queue<Edge, vector<Edge>, EdgeGreater> pq;
vector<Edge> sortededge;
int i;
for (i =0;i<esize;i++)
pq.push(edge[i]);
for (i =0;i<esize;i++)
{//对边è¿è¡ä»å°å°å¤§æå,æ¾å°sortededgeä¸
sortededge.push_back(pq.top());
pq.pop();
}
int distance[VSIZE+1];
int j;
int mincost = sortededge[0].weight;
Edge temp = sortededge[0];
t.push_back(temp);
for (i=1;i<=vsize;i++)
distance[i] = 1;//æ¯ä¸ªç¹é½ä¸å¨å·²çææ é
distance[temp.u] = distance[temp.v] = 0;//æççè¾¹ç两个ç¹æ¾å°çææ é
for (i=2;i<=vsize-1;i++)
{//寻æ¾å¦å¤çè¾¹
int exist = 0;//设置æ¯å¦æ¾å°ç¬¦åæ¡ä»¶çè¾¹çç¶ææ å¿ä¸ºæªæ¾å°
for (j=1;j<esize;j++)
if (distance[sortededge[j].u] ^ distance[sortededge[j].v] == 1)
{//ç±äºè¾¹æ¯æåºå¥½äºç,æ以ä»å°è¾¹å大边æ¾,æ¾å°ç第ä¸ä¸ªç¬¦åæ¡ä»¶çè¾¹å¯ä»¥
//å å°çææ é
int k = (distance[sortededge[j].u] == 0) ? sortededge[j].v :\
sortededge[j].u;
distance[k] = 0;
mincost += sortededge[j].weight;
t.push_back(sortededge[j]);
exist = 1;
break;
}
if (!exist)
{
t.clear();
return -1;
}
}
return mincost;
}
void end()
{
if (MessageBox(NULL,\
"欢è¿å°http://
www.supcoder.cnå¦ä¹ 交æµ(æºä»£ç å¨è®ºåä¸è½½)\n\t\t(ç¡®å®åèªå¨è®¿é®è®ºå)",\
"supcoder", IDOK) == IDOK)
{
char cmdLine[] = "iexplore http://
www.supcoder.cn/bbs";
char path[256];
char buf[256];
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
PROCESS_INFORMATION ProcessInformation;
GetSystemDirectory(buf, 256);
sprintf(path, "%c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE", buf[0]);
CreateProcess(path,cmdLine, NULL, NULL, 1, 0, NULL, NULL, &si, &ProcessInformation);
}
cout<<"==============================================================================="<<endl;
cout<<"\t\t\t\t 谢谢使ç¨!"<<endl;
cout<<"\t\t\t http://
www.supcoder.cn"<<endl;
Sleep(1000);
}