Prim 有待提高 有待学习
题目连接:使劲点
/*
NYOJ 38 布线问题.
第一次做最短路的题目.
Prim.贪心的策略.
U代表已经并入的顶点集合,V-U代表还没有并入满足的顶点的集合.
*/
#include<stdio.h>
#include<string.h>
#define INF 0x0ffffff
const int N=505;
int LowCost[N],Map[N][N];//LowCost用来存储与i顶点连接的最小权值.
int Prim(int u0,int n) //Map邻接矩阵,用来存储线的权值,注意的是该图是无向图.
{
bool s[n];//s用来是否已经被连接.
s[u0]=true;//选取任意点开始,最开始就是只有u0.
for(int i=0;i<n;i++)
if(i!=u0)
{
LowCost[i]=Map[u0][i];
s[i]=false;
}//
int Sum=0;
for(int i=0;i<n;i++)
{
int Temp=INF;
int t=u0;
for(int j=0;j<n;j++)
if(!s[j]&&LowCost[j]<Temp)//选取V-U中的点中,距离U中的最小权值的顶点.
{
t=j;//t用来选到的顶点,Temp用来存储其权值.
Temp=LowCost[j];
}
if(u0==t) return Sum;//说明没有合适的点.
Sum+=Temp;//Sum用来存储最小权值和.
s[t]=true;//t点并入U中
for(int j=0;j<n;j++)//更新LowCost.
if(!s[j]&&Map[t][j]<LowCost[j])
LowCost[j]=Map[t][j];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,V;
scanf("%d%d",&n,&V);
memset(Map,'e',sizeof(Map));
for(int i=0;i<V;i++)
{
int a,b,q;
scanf("%d%d%d",&a,&b,&q);
Map[a-1][b-1]=q;
Map[b-1][a-1]=q;
}
int Min=INF;
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
if(temp<Min) Min=temp;
}
printf("%d\n",Min+Prim(n-1,n));
}
}
Kruscal 毫无压力。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=505;
const int Max=250005;
const int INF=0xffffff;
int v,e,father[N];
struct Rode
{
int a,b;
int lenth;
}rode[Max];
void Init()
{
for(int i=0;i<=v;i++)
father[i]=i;
}
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
bool cmp(Rode A,Rode B)
{
if(A.lenth<B.lenth) return true;
return false;
}
int Kruscal()
{
int min=0;
sort(rode,rode+e,cmp);
for(int i=0;i<e;i++)
{
// printf("%d--%d\n",rode[i].a,rode[i].b);
int x=find(rode[i].a);
int y=find(rode[i].b);
// printf("x=%d,y=%d\n",x,y);
if(x!=y)
{
father[x]=y;
min+=rode[i].lenth;
}
// printf("M=%d\n",min);
}
return min;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&v,&e);
Init();
for(int i=0;i<e;i++)
scanf("%d%d%d",&rode[i].a,&rode[i].b,&rode[i].lenth);
int Min=INF,temp;
for(int i=1;i<=v;i++)
{
scanf("%d",&temp);
if(temp<Min) Min=temp;
}
printf("%d\n",Kruscal()+Min);
}
}
现在就是想看看是否所有的MST问题都能用prime和kruscal一起解决。