diff --git a/NYOJ/38_17age.cpp b/NYOJ/38_17age.cpp new file mode 100644 index 0000000..3387fe5 --- /dev/null +++ b/NYOJ/38_17age.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +using namespace std; +const int maxn=505; +const int INF=0x3f3f3f3f; +int map[maxn][maxn]; +int dis[maxn]; +int vis[maxn]; +int N;//N组测试数据 +int V;//点的数量 +int E;//边的数量 +int min_num;//最小外接花费 +void init() +{ + scanf("%d%d",&V,&E); + for(int i=0; i<=V; i++)//初始化图 + for(int j=0; j<=V; j++) + i==j?map[i][j]=0:map[i][j]=INF; + while(E--)//建图 + { + int a,b,c; + scanf("%d%d%d",&a,&b,&c); + map[a][b]=c;//无向图 + map[b][a]=c; + } + min_num=INF; + for(int i=1; i<=V; i++) + { + int x; + scanf("%d",&x); + min_num=min(min_num,x);//生成树连接到外界的最小花费 + dis[i]=map[i][1];//从1开始构造最小生成树 + } + memset(vis,0,sizeof(vis)); + vis[1]=1;//0代表是外界 +} +void Prim() +{ + int min_cost=0;//初始化最小花费 + for(int i=1; idis[j]) + { + point_minn=j; + minn=dis[j]; + } + if(minn==INF) + break; + min_cost+=dis[point_minn]; + vis[point_minn]=1; + for(int j=1; j<=V; j++) + if(vis[j]==0&&dis[j]>map[point_minn][j]) + dis[j]=map[point_minn][j]; + } + printf("%d\n",min_cost+min_num); +} +int main() +{ + scanf("%d",&N); + while(N--) + { + init(); + Prim(); + } + return 0; +}