模板題,有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;
}