HDU 1233
krusal
#include
#include
#include
using namespace std;
#define maxnum 5051
int n,line;//sum为最小权之和,n为顶点个数,line为边数
int cnt;
int par[maxnum];
double sum;
struct node
{
int u,v;
double w;
}list[maxnum];
int cmp(node a,node b)
{
return a.w < b.w;
}
int find(int x)//并查集的路径压缩
{
if(par[x] == -1)
return x;
return par[x] = find(par[x]);
}
void kruskal()
{
int i,j;
sort(list,list+line,cmp);
for(i=0,sum=0;i
krusal
#include
#include
#include
代码一 krusal 100+ms
#include
#include
#include
#include
using namespace std;
int n;//sum为最小权之和,n为顶点个数,line为边数
int cnt;
int par[101];
double sum;
struct node
{
int u;
int v;
double w;
}list[6000];
struct node2
{
double u,v;
}list2[101];
int cmp(node a,node b)
{
return a.w < b.w;
}
int find(int x)//并查集的路径压缩
{
if(par[x] == -1)
return x;
return par[x] = find(par[x]);
}
double kruskal(int line)
{
int i,j;
sort(list,list+line,cmp);
for(i=0,sum=0;i= 10 && bian <= 1000)
{
list[k].u = j+1;
list[k].v = i+1;
list[k++].w = bian;
}
}
}
cnt = 0;
t = kruskal(k);
if(t)
printf("%.1lf\n",t*100);
else
cout<<"oh!"<
代码二Prim 优先队列 60+ms
#include
#include
#include
#include
#include
using namespace std;
int n;//sum为最小权之和,n为顶点个数,line为边数
int cnt;
int par[101];
int link[101][101];
double c[101][101];
int yiwei[101];
int vis[6001];
double sum;
struct node
{
int u;
int v;
double w;
};
struct node2
{
double u,v;
}list2[101];
bool operator < (const node &a,const node &b)
{
return a.w > b.w;
}
int prim(int s)
{
int i,j,k,m,t,u,total;
memset(vis,0,sizeof(vis));
priority_queue qq;
struct node nn;
total = 1;
vis[s] = 1;
sum = 0;
while(total < n)
{
for(i=1;i= 10 && bian <= 1000)
{
c[j][i] = c[i][j] = bian;
link[i][link[i][0]++] = j;
link[j][link[j][0]++] = i;
}
}
}
cnt = 0;
kk = prim(1);
if(kk)
printf("%.1lf\n",sum*100);
else
cout<<"oh!"<
krusal+并查集
#include
#include
#include
using namespace std;
#define maxnum 5051
int n;//sum为最小权之和,n为顶点个数,line为边数
int cnt;
int par[maxnum];
int sum;
struct node
{
int u,v;
double w;
}list[maxnum];
struct node2
{
int u,w;
}list2[maxnum];
int cmp(node a,node b)
{
return a.w < b.w;
}
int find(int x)//并查集的路径压缩
{
if(par[x] == -1)
return x;
return par[x] = find(par[x]);
}
int kruskal(int line)
{
int i,j;
sort(list,list+line,cmp);
for(i=0,sum=0;i