さいしょうせいせいじゅ
2592 ワード
#include <stdio.h>
#include<queue> /// STL
#include<stack> /// STL
#include<string.h>
#define max 100
using namespace std;
int visited[max]={0};
typedef struct Arccell{
int adj;
}Arccell,Adjm[max][max];
typedef struct{
int vexs[max];
Adjm arcs;
int vex,arc;
}Mgraph;
struct{
int adj;
int low;
}edge[max];
int Locatevex(Mgraph &G,int v)
{
int i,k=-1;
for(i=0;i<G.vex;i++)
if(v==G.vexs[i])
{
k=i;
break;
}
return k;
}
void CreateGraph(Mgraph &G)
{
int i,j,k;
int s;
int w;
int v1,v2;
printf (" :
");
scanf("%d%d",&G.vex,&G.arc);
printf(" :
");
for(i=0;i<G.vex;i++)
{
scanf("%d",&s);
G.vexs[i]=s;
}
for(i=0;i<G.vex;i++) ///
for(j=0;j<=G.vex;j++)
G.arcs[i][j].adj=100;
printf(" :
");
for(k=0;k<G.arc;k++)
{
scanf("%d%d%d",&v1,&v2,&w);
i=Locatevex(G,v1);
j=Locatevex(G,v2);
if((i!=-1)&&(j!=-1))
G.arcs[i][j].adj=w;
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
printf(" :
");
for (i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
printf ("%3d ",G.arcs[i][j].adj);
printf("
");
}
}
void prim(Mgraph G,int v) ///
{
int i,j,k,min;
k=Locatevex(G,v);
for (i=0;i<=G.vex;i++)
if (i!=k)
{
edge[i].adj=v;
edge[i].low=G.arcs[k][i].adj;
}
edge[k].low=0;
for (i=1;i<G.vex;i++)
{
min=100;
for (j=0;j<=G.vex;j++)
if (edge[j].low&&edge[j].low<min)
{
min=edge[j].low;
k=j;
}
printf("(%d-%d) :%d
",edge[k].adj,G.vexs[k],min);
edge[k].low=0;
for (j=0;j<=G.vex;j++)
if (edge[j].low&&G.arcs[k][j].adj<edge[j].low)
{
edge[j].low=G.arcs[k][j].adj;
edge[j].adj=G.vexs[k];
}
}
}
int main ()
{
Mgraph G;
CreateGraph(G);
printf(" :
");
prim(G,1);
return 0;
}