畅通工程系列问题题解(HDU 1233 1863 1875 1879)

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

HDU  1863

krusal

#include 
#include 
#include 
#include 
#include 
using namespace std;
#define maxnum 105

int sum,n,line;//sum为最小权之和,n为顶点个数,line为边数
int u[maxnum],v[maxnum],w[maxnum],r[maxnum],p[maxnum];//u起点,v终点,w权值

int cmp(const int i,const int j)
{
	return w[i] < w[j];
}

int find(int x)//并查集的路径压缩
{
	return p[x]==x?x:p[x]=find(p[x]);
}

int kruskal()
{
	int i,j,k;
	int cnt = 0;

	for(i=0;i>line>>n,line)
	{
		for(i=0;i>u[i]>>v[i]>>w[i];
		}
		
		t = kruskal();
		
		if(t)
			cout<

hdu 1875

代码一  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!"<

HDU  1879

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



你可能感兴趣的:(最小生成树)