poj1251-prim最小生成树(dij改写)

本文探讨了dijkstra算法与prim算法的相似性,指出dijkstra算法通过松弛边操作,而prim算法则采用贪心策略。重点讨论了如何将dijkstra算法改写成求解最小生成树的方法,关键在于调整松弛步骤。
摘要由CSDN通过智能技术生成

刚刚看完dij感觉和prim差不多,dij是松弛边,而prim是贪心,改写关键在于松弛这一步的改变,

写的时候发现了区别,最短路只需对边的操作,且是单源的,一开始simple都错了,我就在想why
后来发现,最小生成树prim必需是任意点出发都能构成这样一棵树,就是读入是边是dij的两倍,因为是双向图
改后一交,TLE。。。无语,看discuss说不能用scanf,改成cin后果断0s过了。。。
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<utility>
#define N 1000
#define inf 9999999
using namespace std;
typedef pair<int,int>pii;
priority_queue<int,vector<pii>,greater<pii>>q;
int d[N],first[N],nxt[N],u[N],v[N],w[N];
int prim(int n)
{
bool done[N];
int ans=0;
for(int i=0;i<n;i++)
{
d[i]=(i==0?0:inf);
}
memset(done,0,sizeof(done));
q.push(make_pair(d[0],0));
while(!q.empty())
{
pii u=q.top();q.pop();
int x=u.second;
if(done[x])continue;
else
ans+=u.first;
done[x]=1;
for(int e=first[x];e!=-1;e=nxt[e])
if(d[v[e]]>w[e])
{
d[v[e]]=w[e];
q.push(make_pair(d[v[e]],v[e]));
}
}
return ans;
}
int main()
{
int i,k=0,j,n,m,x,y,wh;
char ch;
while(1)
{
cin>>n;
getchar();
if(n==0)
return 0;
for(i=0;i<n;i++)
first[i]=-1;
for(i=1;i<n;i++)
{
cin>>ch;
x=ch-'A';
cin>>m;
getchar();
for(j=0;j<m;j++)
{
cin>>ch;
getchar();
y=ch-'A';
cin>>wh;
    getchar();
u[k]=x;v[k]=y;
w[k]=wh;
nxt[k]=first[u[k]];
first[u[k]]=k;
k++;
u[k]=y,v[k]=x,w[k]=wh;
nxt[k]=first[u[k]];
first[u[k]]=k;
k++;
}
}
cout<<prim(n)<<'\n';
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值