最小生成树带判断连通
也是函数直接用就行
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
#define MIN INT_MAX
#define MAX_Point 120 //最大的顶点数
#define MAX_Edge 14400 //最大的边数
int flag1=0;
double sum ;
double arr_list[MAX_Point][MAX_Point] ;
struct Edge
{
int point ;
double lowcost ;
int flag;
} ;
Edge edge[MAX_Edge] ;
double prim( int n )// n表示树顶点的个数!
{
int i , j , k = 1,flag ;
double min,sum2=0 ;
j = 1 ;
for( i = 1 ; i< = n ; i ++ )
{
if (i != j )
{
edge[i].point = i ;
edge[i].lowcost = arr_list[j][i] ;
edge[i].flag=0;
}
}
edge[j].lowcost = 0 ; edge[j].flag=1;
for( i = 2 ; i< = n ; i++ )
{
k=1;
min = MIN ;
flag=0;
for( j=2;j<=n; j++ )
{
if ( edge[j].flag== 0 && edge[j].lowcost < min)
{
k = j ;
min = edge[j].lowcost ;
flag=1;
}
}
if (!flag) return -1;
sum2 += min ;
edge[k].flag=1;
for(j = 2 ; j <= n ; j++ )
{
if( edge[j].flag== 0&&arr_list[k][j] < edge[j].lowcost)
{
edge[j].point = k ;
edge[j].lowcost = arr_list[k][j] ;
}
}
}
return sum2;
}
int main(int argc, char *argv[])
{
double t,time_data;
int n,m;
int a,b;
while(cin>>n>>m)
{
if (n==0) break;
sum=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
arr_list[i][j]=INT_MAX;
for(int i=1;i<=n;i++)
{
cin>>a>>b>>time_data;
//下面很关键 边界数据 没有就AC 不了
if (time_data<arr_list[a][b])
{
arr_list[a][b]=time_data;
arr_list[b][a]=time_data;
}
}
sum=prim(m);
if (sum!=-1) //是连通的
//cout<<sum<<endl;
printf("%.lf\n",sum);
else //非连通的
printf("?\n");
}
//system("PAUSE");
return EXIT_SUCCESS;
}
HDU 这方面的题很多!1102,1301,1162,1875,1233
陈宇老师写的,非常好!