Out of Hay POJ 2395(prim+Kruskal)

模板題,有n個農場m條路,每條路每個單元格要花一格水,到下一個農場就能補滿水,問你要使水鏈接的農場是最短路的前提下,要需要多少容量的容器來裝水。

列出最短路後求他們之間最長的那一條路就是答案,,沒什麼難的

prim:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=2050;

int map[MAXN][MAXN];
int dis[MAXN];
int vis[MAXN];

int n,m;

void prim()
{
	for(int i=1;i<=n;i++)
		dis[i]=map[1][i];
	vis[1]=1;
	int ans=-INF;
	for(int i=1;i<n;i++)
	{
		int pos=-1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&(pos==-1||dis[pos]>dis[j]))
				pos=j;
		}
		vis[pos]=1;
		if(pos==-1)
			break;
		ans=max(ans,dis[pos]);
		for(int k=1;k<=n;k++)
		{
			if(!vis[k])
				dis[k]=min(dis[k],map[pos][k]);
				
		}
	}
	cout<<ans<<endl;
	return;
}

int main()
{
	cin>>n>>m;
	int a,b,c;
	memset(map,INF,sizeof(map));
	for(int i=0;i<m;i++)
	{
		cin>>a>>b>>c;
		map[a][b]=map[b][a]=min(c,map[a][b]);
	}
	prim();
	return 0;
}

Kruskal:

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int MAXN=2050;
const int INF=0x3f3f3f3f;

int par[MAXN];
int n,m;

struct node{
	int from;
	int to;
	int cost;
	bool operator < (const node &a) const
	{
		return cost<a.cost;
	}
}map[10100];

int find(int x)
{
	if(x==par[x])
		return x;
	else
		return par[x]=find(par[x]);
}

void unite(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x!=y)
		par[x]=y;
}

bool same(int x,int y)
{
	return find(x)==find(y);;
}

void kruskal()
{
	int ans=-INF;
	for(int i=0;i<=n;i++)
		par[i]=i;
	for(int i=0;i<m;i++)
	{
		if(!same(map[i].from,map[i].to))
		{
			unite(map[i].from,map[i].to);
				ans=max(ans,map[i].cost);
		}
	}
	cout<<ans<<endl;
	return;
}

int main()
{
	cin>>n>>m;
	int a,b,c;
	for(int i=0;i<m;i++)
	{
		cin>>a>>b>>c;
		map[i].from=a;
		map[i].to=b;
		map[i].cost=c;
	}
	sort(map,map+m);
	kruskal();
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章