2 条题解

  • 1
    @ 2026-8-9 10:49:41

    我们看到最小生成树输出该树的总权重以及所选边的索引序列,最合适的自然就是KruskalKruskal算法,它可以模拟整颗树的构造过程,最适配这种题

    这道题有点板,就不用过多解释了,但我就不用普通写法......

    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5+10;
    struct node{int u,v,w,id;}G[N];
    int n,m,fa[N];
    long long ans;
    vector<int>s;
    bool cmp(node a,node b){return a.w<b.w;}
    int find(int x){return (fa[x]==x)?x:fa[x]=find(fa[x]);}
    bool pd(int x,int y)
    {
    	int rx=find(x),ry=find(y);
    	if(rx==ry)return 0;
    	fa[ry]=rx;
    	return 1;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1,x,y,z;i<=m;i++)
    	{
    		scanf("%d%d%d",&x,&y,&z);
    		G[i]={x,y,z,i-1};
    	}
    	sort(G+1,G+m+1,cmp);//保证贪心,优先小边权 
    	for(int i=1;i<=n;i++)fa[i]=i;
    	for(int i=1;i<=m&&s.size()<n-1;i++)
    	{
    		if(pd(G[i].u,G[i].v))
    		{
    			ans+=G[i].w;
    			s.push_back(G[i].id);
    		}
    	}
    	printf("%lld\n",ans);
    	for(int i=0;i<n-1;i++)printf("%d ",s[i]);
    	return 0;
    }
    
    • 1
      @ 2026-8-7 15:13:22
      #include<bits/stdc++.h>
      using namespace std;
      const int N = 5e5 + 10;
      #define int long long
      typedef tuple<int, int, int, int> tp4;
      priority_queue<tp4, vector<tp4>, greater<tp4> > edge;
      int fa[N], n, m;
      int findfa(int x){return (fa[x] == x ? fa[x] : fa[x] = findfa(fa[x]));}
      bool merge(int x, int y)
      {
          int xfa = findfa(x), yfa = findfa(y);
          if (xfa == yfa) return 0;
          fa[xfa] = yfa;
          return 1;
      }
      signed main()
      {
          cin >> n >> m;
          for (int i = 1; i <= n; i++) fa[i] = i;
          for (int i = 1; i <= m; i++)
          {
              int u, v, w; cin >> u >> v >> w;
              u ++; v ++; edge.push({w, u, v, i});
          }
          int t = n - 1, sum = 0;
          vector<int> vec;
          while (t)
          {
              auto [w, u, v, i] = edge.top(); edge.pop();
              if (merge(u, v)) t --, sum += w, vec.push_back(i);
          }
          cout << sum << endl;
          for (auto i : vec) cout << i - 1 << " ";
          return 0;
      }
      
      • 1

      最小生成树(Minimum Spanning Tree)

      信息

      ID
      8178
      时间
      500ms
      内存
      1024MiB
      难度
      7
      标签
      递交数
      15
      已通过
      9
      上传者