poj 1258

来源:互联网 发布:六味地黄丸 知乎 编辑:程序博客网 时间:2024/05/17 23:33

POJ——1258

先用的是Kruskal算法


#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;const int maxn=10000+5;struct temp{int u;int v;int dis;bool operator < (const temp &a) const{return dis<a.dis;}}edge[maxn];int mark[105];int havefind[105];int main(){int N;while(scanf("%d",&N)!=EOF){int edgenum=1;int sum=0;for(int i=1;i<=N;++i){mark[i]=i;havefind[i]=0;for(int j=1;j<=N;++j){int disd;scanf("%d",&disd);edge[edgenum].u=i;edge[edgenum].v=j;edge[edgenum].dis=disd;edgenum++;}}sort(edge+1,edge+edgenum);int edgeset=0;for(int i=N+1;edgeset<N-1;){int x=edge[i].u;int y=edge[i].v;if(mark[x]==mark[y]){i++;continue;}if(!havefind[x]&&!havefind[y]){edgeset++;havefind[x]=1;havefind[y]=1;mark[x]=mark[y];sum+=edge[i].dis;}else if(!havefind[x]&&havefind[y]){havefind[x]=1;edgeset++;mark[x]=mark[y];sum+=edge[i].dis;}else if(havefind[x]&&!havefind[y]){havefind[y]=1;mark[y]=mark[x];edgeset++;sum+=edge[i].dis;}else{int tmp=mark[y];edgeset++;for(int t=1;t<=N;++t){if(mark[t]==tmp){mark[t]=mark[x];}}sum+=edge[i].dis;}i++;}cout<<sum<<endl;}return 0;}

第一次写的时候在主循环中判断当两个节点都已经找到过的时候进行修改标记的代码有问题,re,但是到现在还不知道为什么会错了


else{int tmp=mark[x];mark[y]=tmp;for(int t=N+1;t<=i;++t){if(edge[t].u==y){if(havefind[edge[t].v])mark[edge[t].v]=tmp;}else if(edge[t].v==y){if(havefind[edge[t].u])mark[edge[t].u]=tmp;}}sum+=edge[i].dis;edgeset++;}

上面的Kruskal算法效率很低,仅仅可以用于理解算法而已

下面是Prim算法

*******************************************************************************************

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int maxn=105;
const int INF=100005;
int N;


int town[maxn][maxn];

int prim(){
int vis[maxn];
int dis[maxn];
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;++i){
dis[i]=INF;
}//赋初值
int s=1;
dis[s]=0;
int point;
int low_w;
int tot=0;
for(int m=1;m<=N;++m){
low_w=INF;
for(int i=1;i<=N;++i){
if(!vis[i]&&dis[i]>town[s][i]){
dis[i]=town[s][i];
}
if(!vis[i]&&low_w>dis[i]){
low_w=dis[i];
point=i;
}
}
s=point;
tot+=low_w;
vis[s]=1;
// cout<<tot<<endl;

return tot;
}


int main(){
while(cin>>N){
for(int i=1;i<=N;++i){
for(int j=1;j<=N;++j){
scanf("%d",&town[i][j]);
}
}
cout<<prim()<<endl;
}//while
return 0;
}

********************************************************

</pre><p></p><pre code_snippet_id="122946" snippet_file_name="blog_20131222_2_2620942" name="code" class="cpp"><pre code_snippet_id="122946" snippet_file_name="blog_20131222_2_2620942" name="code" class="cpp"><pre code_snippet_id="122946" snippet_file_name="blog_20131222_2_2620942" name="code" class="cpp"><pre code_snippet_id="122946" snippet_file_name="blog_20131222_2_2620942">
                                             
0 0
原创粉丝点击