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">
- Poj 1258
- poj 1258
- POJ 1258
- poj 1258
- POJ 1258
- POJ 1258
- poj 1258
- poj 1258
- poj 1258
- POJ 1258
- poj 1258
- poj 1258
- poj 1258
- POJ 1258
- POJ 1258
- POJ 1258
- POJ 1258
- POJ - 1258
- 恒大竟然被绝杀了
- Mat::create
- android-关于ContentProvider的使用
- 上周软件大会
- 长这么大,还是第一次有人这么夸我
- poj 1258
- ReadPwd读windows内存中明文密码
- 如何进行高效记忆
- 你这个机智的家伙
- mysql常用的函数
- RHEL6系统rpm方式安装MySQL数据库
- 上海大学女子逼婚?
- poj 1125
- SNMP--Windows API--SnmpUtilOidCmp