diff --git a/min_tree_teacher.cpp b/min_tree_teacher.cpp new file mode 100644 index 0000000..e5d81c6 --- /dev/null +++ b/min_tree_teacher.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +/* +4 5 +1 2 2 +1 3 2 +1 4 3 +2 3 4 +3 4 3 +*/ +#define INT 0x3f3f3f3f +using namespace std; +const int maxn = 5010; +int a[maxn][maxn];//起始点和终点的数组 +int vis[maxn],dist[maxn];//vis[]表示是否已经被访问,dist表示到当前节点的最小权值 +int n,m;//节点数和边数 +int u,v,w;//u到v的权值 +long long sum = 0;//最小生成树的权值 +int prim(int pos) +{ + dist[pos] = 0;//初始值设置为0 + for(int i = 1 ; i<=n ; i++)//遍历节点,使其默认为未访问 + { + int cur = -1;//vis[-1]表示未被访问 + for(int j = 1; j <=n ; j++) + { + /*这个if用来判断当前是否是为距离已访问节点最近节点的权值为最小值 + cur = -1代表着未访问,那么肯定要访问,通过for循环来进行访问 + ,for(i)是将每个节点进行循环,for(j)是通过对cur和dist数值进行比值 + dist除1=0,其他的初始化为INT, + */ + if(!vis[j] && (cur == -1 || dist[j] < dist[cur])) + cur = j;//更新访问状态 + }//第一次出门的时候cur = 1,j>n, + if (dist[cur] >= INT) return INT; + sum += dist[cur]; + vis[cur] = 1; + for(int k = 1; k <= n; k++) + /*第一次for已经选择了j节点作为起点, + 开始计算dist[],后续的for(k)其实是更新min,*/ + { + if(!vis[k]) + dist[k] = min(dist[k],a[cur][k]); + } + + } + return sum; +} +int main() +{ + scanf("%d%d",&n,&m); + memset(a,0x3f,sizeof(a)); + memset(dist,0x3f,sizeof(dist)); + while(m--) + { + scanf("%d%d%d",&u,&v,&w); + a[u][v] = min(a[u][v],w); + a[v][u] = min(a[v][u],w); + } + int value = prim(1); + if(value >= INT) puts("orz"); + else printf("%lld\n",sum); + return 0; +} \ No newline at end of file