1 条题解
-
0
C :
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 110 #define INF 1000000000 int G[maxn][maxn]; int dp[maxn]; int vis[maxn]; int n; int prime(){ memset(vis,0,sizeof(vis)); for(int i = 0;i <= n; i++)dp[i] = INF; dp[1] = 0; int ans = 0; for(int i = 1;i <= n; i++){ int u = -1, MIN = INF; for(int j = 1;j <= n; j++){ if(vis[j]==0 && dp[j] < MIN){ u = j; MIN = dp[j]; } } vis[u] = 1; ans += MIN; for(int v = 1;v <= n; v++){ if(vis[v]==0 && G[u][v] != 0 && dp[v] > G[u][v]){ dp[v] = G[u][v]; } } } return ans; } int main() { while(scanf("%d",&n) != EOF){ memset(G,0,sizeof(G)); for(int i = 1;i <= n; i++){ for(int j = 1;j <= n; j++){ scanf("%d",&G[i][j]); } } printf("%d\n",prime()); } return 0; }C++ :
#include<iostream> #include<cstring> using namespace std; int n,f,sum=0; int fei[110][110],dis[110]; int main() { memset(fei,0x7f,sizeof(fei)); cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>f; if(f!=0) fei[i][j]=f; } } sum=0;//记录造价 int x=2; for(int i=1;i<=n;i++) dis[i]=fei[x][i];//把x放入已选集合,更新其他点到x的距离 dis[x]=0;//x到自己的距离为0,这个很重要,容易忽视 for(int i=2;i<=n;i++)//只需要找到n-1条边就可以形成一棵最小生成树 { int min=0x7f7f7f7f,k;//min找最短的符合要求的边,k记录边的另一节点 for(int j=1;j<=n;j++)//枚举每一个点,找离已选点最近的边 { if(dis[j]<min && dis[j]!=0)//dis[j]=0表示j点已选 { min=dis[j]; k=j; } } sum+=dis[k]; dis[k]=0;//dis[k]设为0,表示k点一进入已选点 for(int j=1;j<=n;j++)//更新其他点到k点的距离 { if(dis[j]>fei[k][j]) dis[j]=fei[k][j]; } } cout<<sum<<endl; /* for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout<<fei[i][j]<<' '; } cout<<endl; }*/ return 0; }
- 1
信息
- ID
- 1468
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者