最小生成树—城市公交网建设问题

题目描述

有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少?

输入

n(城市数,1<≤n≤100)

e(边数)

以下e行,每行3个数i,j,wiji,j,wij ,表示在城市i,j之间修建高速公路的造价。

输出

n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。

样例输入

5 8
1 2 2
2 5 9
5 4 7
4 1 10
1 3 12
4 3 6
5 3 3
2 3 8

样例输出

1 2
2 3
3 4
3 5

这个题一定要看清楚样例输出,不能在选择的时候输出,而是要储存在数组中(否则输出就变成了1 2 ,2 3,3 5, 3 4)。输出的时候把起始点的序号按从小到大输出,如果相同按终点的序号从小到大输出,但是这样还不够。观察输入数据,我们发现有的数据是左城市序号大于右城市,而输出的时候都是左边的城市序号小于右边城市的序号。我就在这里wa了四五次,最后找同学帮忙才知道的。

 

Dijstra算法:

#include 
#include 
#include 
using namespace std;
#define inf 0x3f3f3f3f
int n,m,f[110];
struct Node 
{
	int u,v,w;
}e[10010],ans[110];                            //ans数组记录答案
bool cmp1(Node a,Node b)
{
	return a.w>n>>m;
	for (int i=1;i<=m;i++)
		cin>>e[i].u>>e[i].v>>e[i].w;
	sort(e+1,e+m+1,cmp1);
	for (int i=1;i<=n;i++)
	    f[i]=i;
	int count=0,k=0;
	for (int i=1;i<=m;i++)
	{
		if (merge(e[i].u,e[i].v))
		{
			k++;
			if (e[i].u

 

Prim算法:

#include 
#include 
#include 
using namespace std;
#define inf 0x3f3f3f3f
int n,m,e[110][110];
struct Node
{
	int pre,to,n;
}dis[110],ans[110];    //dis数组不只记录最小花费,还记录左城市序号和右城市序号,ans记录答案
int k=0;               //记录ans数组中元素的个数
bool cmp(Node a,Node b)
{
	if (a.pre!=b.pre) return a.pree[u][j])//重新更新起点城市到其它城市的最短距离
		      {
				dis[j].n=e[u][j];
				dis[j].pre=u;     //记录这个最短距离的从哪个城市到哪个城市
				dis[j].to=j;
		      }
	}
}
int main ()
{
	cin>>n>>m;
	int u,v,w;
	memset(e,inf,sizeof(e));
	for (int i=1;i<=n;i++)
	    e[i][i]=0;
	for (int i=0;i>u>>v>>w;
		e[u][v]=w;
		e[v][u]=w;
	}
	prim();
	sort(ans,ans+k,cmp);
	for (int i=0;i

 

你可能感兴趣的:(图论)