果然复习期间一个题都没敲就是手生了。
一定要记得啊:重复边保存最小的!!!
一开始还是没想到这个,最后忍无可忍动用了模版也没过才想到....
prim算法代码操作就不说了,直接上代码:
#include <stdio.h>
#include <string.h>
#define typec int // type of cost
const typec inf = 0x3f3f3f3f; // max of cost
#define V 105
int vis[V],dis[V][V];
typec lowc[V];
typec prim(typec cost[][V], int n) // vertex: 0 ~ n-1
{
int i, j, p;
typec minc, res = 0;
memset(vis, 0, sizeof(vis));
vis[0] = 1;
for (i=1; i<n; i++)
{
lowc[i] = cost[0][i];
}
for (i=1; i<n; i++)
{
minc = inf;
p = -1;
for (j=0; j<n; j++)
{
if (0 == vis[j] && minc > lowc[j])
{
minc = lowc[j];
p = j;
}
}
if (inf == minc)
{
return -1; // 原图不连通
}
res += minc;
vis[p] = 1;
for (j=0; j<n; j++)
{
if (0 == vis[j] && lowc[j] > cost[p][j])
{
lowc[j] = cost[p][j];
}
}
}
return res;
}
int main()
{
int m,n,i,j,x,y,w;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
dis[i][j]=0;
}
else
{
dis[i][j]=inf;
}
}
}
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
scanf("%d",&w);
if(dis[x-1][y-1]>w)
{
dis[y-1][x-1]=w;
dis[x-1][y-1]=w;
}
}
printf("%d\n",prim(dis,n));
}
}