题目:求出给定无向带权图的最小生成树,图的定点为字符型。
输入:第一行为图的顶点个数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<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
const int inf=0x3f3f3f3f;
using namespace std;
int m[105][105];
int vis[105];//标记某点是否已访问
int dis[105];//记录每2个点间最小权值
int path[105];//记录最短路线
int n;
string s;
void prim() {
int i,j,k,tmp;
for(i=0;i<n;i++)
dis[i]=inf;//初始化
dis[0]=0;
for(i=0;i<n;i++)
{
tmp=inf;
for(j=0;j<n;j++)
{
if(!vis[j]&&tmp>dis[j])
{
tmp=dis[j];
k=j;
}//找出最小距离的节点
}
if(i)
cout<<'('<<s[path[k]]<<','<<s[k]<<')';
vis[k]=1;//把访问的节点做标记
int min=inf;
for(j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>m[k][j])
{
dis[j]=m[k][j];
//更新最短距离
path[j]=k;
}
}
}
}
int main() {
int e;
cin>>n>>e>>s;
mem(m,0x3f);
while(e--)
{
char x,y;
int t;
cin>>x>>y>>t;
m[x-'A'][y-'A']=m[y-'A'][x-'A']=t;
}
prim();
return 0;
}