Prim POJ1258 POJ2485 POJ1789 POJ1751

来源:互联网 发布:知柏地黄丸治疗湿热吗 编辑:程序博客网 时间:2024/05/21 21:47


POJ1258

简单Prim 邻接矩阵存边

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int INF=100001;int n;int a[200][200],dis[200];bool vis[200];int Prim(){memset(vis,false,sizeof(vis));for (int i=1;i<=n;i++) dis[i]=a[1][i];int ans=0;vis[1]=true;for (int i=1;i<=n-1;i++){int tmp=INF,k=0;for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]<tmp){tmp=dis[j];k=j;}}if (k==0) return -1;vis[k]=true;ans=ans+dis[k];for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]>a[k][j])  dis[j]=a[k][j];}}return ans;}int main(){while (scanf("%d",&n)!=EOF){for (int i=1;i<=n;i++)  for (int j=1;j<=n;j++)    scanf("%d",&a[i][j]);printf("%d\n",Prim());}return 0;}

POJ2485

简单Prim 变形,求最小生成树中最短的边。

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int INF=1<<30; int dis[505],a[505][505];bool vis[505];int n;int Prim(){memset(vis,false,sizeof(vis));for (int i=1;i<=n;i++) dis[i]=a[1][i];int ans=0;vis[1]=true;for (int i=1;i<=n-1;i++){int tmp=INF,k=0;for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]<tmp){tmp=dis[j];k=j;}}if (k==0) return -1;ans=max(ans,dis[k]);vis[k]=true;for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]>a[k][j])  dis[j]=a[k][j];}}return ans;}int main(){int cases;scanf("%d",&cases);while (cases--){scanf("%d",&n);for (int i=1;i<=n;i++)  for (int j=1;j<=n;j++)    scanf("%d",&a[i][j]);printf("%d\n",Prim());}return 0;}


POJ1789

简单Prim

#include <iostream>#include <cstring>#include <cstdio>using namespace std;bool vis[3000];int dis[3000],a[2500][2500];int n;int Prim(){memset(vis,false,sizeof(vis));for (int i=1;i<=n;i++) dis[i]=a[1][i];int ans=0;vis[1]=true;for (int i=1;i<=n-1;i++){int tmp=100,k=0;for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]<tmp){tmp=dis[j];k=j;}}if (k==0) return -1;ans+=dis[k];vis[k]=true;for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]>a[k][j])  dis[j]=a[k][j];}}return ans;}int main(){char ch[2500][10];while (scanf("%d",&n),n!=0){for (int i=1;i<=n;i++){cin>>ch[i];}for (int i=1;i<=n;i++){for (int j=i+1;j<=n;j++){int t=0;for (int k=0;k<7;k++)  if (ch[i][k]!=ch[j][k]) t++;a[i][j]=a[j][i]=t;}}printf("The highest possible quality is 1/%d.\n",Prim());}return 0;}


POJ1751  ZOJ2048

注意 两个OJ 的输入方式不同= =、

题目大意:在图中,有些边已经连接,输出最小生成树的方案。

分析:连接的边赋值为0即可。

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#define Maxn 760using namespace std;struct Node{double x,y;}b[Maxn];double dis[Maxn],a[Maxn][Maxn];bool vis[Maxn];int pre[Maxn];int n,m;double Distance(int i,int j){double tmp=sqrt((b[i].x-b[j].x)*(b[i].x-b[j].x)+(b[i].y-b[j].y)*(b[i].y-b[j].y));return tmp;}int Prim(){for (int i=1;i<=n;i++){dis[i]=a[1][i];pre[i]=1;}memset(vis,false,sizeof(vis));vis[1]=true;for (int i=1;i<=n-1;i++){double Min=100000;int k=0;for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]<Min){Min=dis[j];k=j;}}if (k==0) break;vis[k]=true;if (Min!=0) printf("%d %d\n",pre[k],k);for (int j=1;j<=n;j++){if (!vis[j]&&dis[j]>a[k][j]){dis[j]=a[k][j];pre[j]=k;}}}}int main(){int cases;int u,v;scanf("%d",&cases);while (cases--){scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%lf%lf",&b[i].x,&b[i].y);}for (int i=1;i<=n;i++){for (int j=i+1;j<=n;j++){a[i][j]=a[j][i]=Distance(i,j);}}scanf("%d",&m);for (int i=1;i<=m;i++){scanf("%d%d",&u,&v);a[u][v]=a[v][u]=0;}Prim();if (cases>0) putchar('\n');}return 0;}


0 0
原创粉丝点击