您的位置:首页 > 其它

最小生成树之prim算法

2012-07-05 10:13 405 查看
prim算法理论基于MST性质,实现过程如下图所示:



附上HDU1233 AC CODE:

#include <algorithm>
#include <functional>
#include <list>
#define MAX 101
using namespace std;

int n,a,b,c;
int map[MAX][MAX];
list<int> v,u;

int main()
{
while(scanf("%d",&n)!=EOF && n!=0)
{
memset(map,0,sizeof(map));
v.clear();
u.clear();
for(int i=0;i<(n*(n-1)/2);i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}

for(int i=1;i<=n;i++)
{
v.push_back(i);
}
u.push_back(*v.begin());
v.erase(v.begin());
int sum=0;
while(v.size())
{
int min=1<<30;
list<int>::iterator viter,uiter,vi,ui;
for(vi=v.begin();vi!=v.end();vi++)
{
for(ui=u.begin();ui!=u.end();ui++)
{
if(map[*vi][*ui]<min)
{
min=map[*vi][*ui];
viter=vi;
uiter=ui;
}
}
}
sum+=min;
u.push_back(*viter);
v.erase(viter);
}
printf("%d\n",sum);
}
return 0;
}


HDU1879

#include <algorithm>
#include <functional>
#include <list>
#define MAX 101
using namespace std;

int n;
int val[MAX][MAX];
bool has[MAX][MAX];
list<int> v,s;

int main()
{
while(scanf("%d",&n)!=EOF && n!=0)
{
memset(val,0,sizeof(val));
memset(has,false,sizeof(has));
v.clear();
s.clear();

for(int i=0;i<(n*(n-1)/2);i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
val[a][b]=val[b][a]=c;
has[a][b]=has[b][a]=(d==1?true:false);
}

for(int i=1;i<=n;i++)
{
v.push_back(i);
}

s.push_back(v.front());
v.pop_front();
int sum=0;
while(v.size())
{
list<int>::iterator viter,vi,si;
int m=1<<30;
for(vi=v.begin();vi!=v.end();vi++)
{
for(si=s.begin();si!=s.end();si++)
{
if(val[*vi][*si] && val[*vi][*si]<=m || has[*vi][*si])
{
if(has[*vi][*si])
{
m=0;
}
else
{
m=val[*vi][*si];
}
//printf("%d->%d:%d\n",*vi,*si,m);
viter=vi;
}
}
}
sum+=m;
s.push_back(*viter);
v.erase(viter);
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: