0
点赞
收藏
分享

微信扫一扫

SWUST OJ 1075: 求最小生成树(Prim算法)

题目描述

求出给定无向带权图的最小生成树。图的定点为字符型,权值为不超过100的整形。在提示中已经给出了部分代码,你只需要完善Prim算法即可。

#include< iostream> 
using namespace std; 

typedef struct 
{ 
int n; 
int e; 
char data[500]; 
int edge[500][500]; 
}Graph; 

typedef struct 
{ 
int index; 
int cost; 
}mincost; 

typedef struct 
{ 
int x; 
int y; 
int weight;    
}EDGE; 


typedef struct 
{ 
int index; 
int flag; 
}F; 

void create(Graph &G,int n ,int e) 
{ 
int i,j,k,w; 
char a,b; 
for(i=0;i< n;i++) 
cin>>G.data[i]; 
for(i=0;i< n;i++) 
for(j=0;j< n;j++) 
{ 
if(i==j) 
G.edge[i][j]=0; 
else 
G.edge[i][j]=100; 
} 

for(k=0;k< e;k++) 
{ 
cin>>a; 
cin>>b; 
cin>>w; 
for(i=0;i< n;i++) 
if(G.data[i]==a) break; 
for(j=0;j< n;j++) 
if(G.data[j]==b) break; 

G.edge[i][j]=w; 
G.edge[j][i]=w; 
} 
G.n=n; 
G.e=e; 
} 

void Prim(Graph &G,int k) 
{ 

//完成Prim算法 

} 

int main() 
{ 
Graph my; 
int n,e; 
cin>>n>>e; 
create(my,n,e); 
Prim(my,0);    
return 0; 
} 

输入

第一行为图的顶点个数n第二行为图的边的条数e接着e行为依附于一条边的两个顶点和边上的权值

输出

最小生成树中的边。

样例输入

6
10
ABCDEF
A B 6
A C 1
A D 5
B C 5
C D 5
B E 3
E C 6
C F 4
F D 2
E F 6

样例输出

(A,C)(C,F)(F,D)(C,B)(B,E)

参考程序

#include<iostream>
using namespace std;
 
typedef struct
{
    int n;
    int e;
    char data[50];
    int edge[50][50];
}Graph;
 
typedef struct  
{
    int index;
    int cost;
}mincost;
 
void create(Graph &G,int n ,int e)
{
    int i,j,k,w;
    char a,b;
    for(i=0;i<n;i++)  cin>>G.data[i];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            if(i==j) G.edge[i][j]=0;
            else G.edge[i][j]=100;   //最大值
        }
    for(k=0;k<e;k++)
        {
            cin>>a;
            cin>>b;
            cin>>w;
            for(i=0;i<n;i++)
                if(G.data[i]==a) break;
            for(j=0;j<n;j++)
                if(G.data[j]==b) break;
            G.edge[i][j]=w;
            G.edge[j][i]=w;   //对称矩阵
        }
        G.n=n;
        G.e=e;
}
 
void mintree(Graph &G,int k)
{
    int i,j,mindata,loc;
    mincost lowcost[50];
    for(i=0;i<G.n;i++)
    {
        if(i!=k)
        {
            lowcost[i].index=k;
            lowcost[i].cost=G.edge[k][i];
        }
        lowcost[k].cost=0;
        lowcost[k].index=k;
    }
 
    for(i=0;i<G.n-1;i++)
    {
        mindata=100;
        for(j=0;j<G.n;j++)
            if(lowcost[j].cost<mindata&&lowcost[j].cost!=0)
            {
                mindata=lowcost[j].cost;
                loc=j;
            }
 
            cout<<"("<<G.data[lowcost[loc].index]<<","<<G.data[loc]<<")";
 
            for(j=0;j<G.n;j++)
            {
                if(G.edge[loc][j]<lowcost[j].cost)
                {
                    lowcost[j].cost=G.edge[loc][j];
                    lowcost[j].index=loc;   //前结点
                }
            }
    }
}
 
int main()
{
    Graph my;
    int n,e;
    cin>>n>>e;
    create(my,n,e);
    mintree(my,0); 
    return 1;
}

注意

该程序仅供学习参考!

举报

相关推荐

0 条评论