1008-H专题四

来源:互联网 发布:unity3d星空天空盒 编辑:程序博客网 时间:2024/05/16 04:43

1.题意:给出一个不成环的图,在只能构成一个环的情况下,求出这个环的权值和最大值

2.思路:这是并查集的问题,当边上的两个节点的根节点相同时,会构成环,这时候就要考虑是构成一个环还是构成两个环,如果构成一个环,那么保留,如果是两个环,就舍弃,把整个图遍历之后,最后输出最大值

3.感想:与前面的一个并查集问题相似。

#include<cstdio>  #include<algorithm>  #include<cstring>  #include<iostream>  using namespace std;  const int MAX = 10005;  int visit[MAX];  int father[MAX];  struct edge  {         int s;         int e;         int len;  }a[MAX*15];  int cmp(edge a, edge b)  {          return a.len>b.len;  }  int find(int x)  {          if (x != father[x])              father[x] = find(father[x]);          return father[x];  }  int main()  {         int n, m;         while (cin>>n>>m&&m+n)          {              memset(a, 0, sizeof(a));              int ans = 0;              for (int i = 0; i <= n; i++)              {                  father[i] = i;                  visit[i] = 0;              }              for (int i = 1; i <= m; i++)                  cin >> a[i].s >> a[i].e >> a[i].len;              sort(a + 1, a + m + 1, cmp);              for (int i = 1; i <= m; i++)              {                  int fx = find(a[i].s);                  int fy = find(a[i].e);                  if (fx == fy)                  {                      if (visit[fx] == 1)                          continue;                      visit[fx] = 1;                  }                  else                  {                      if (visit[fx] == 1 && visit[fy] == 1)                          continue;                      else if (visit[fx] == 0)                          father[fx] = fy;                      else                          father[fy] = fx;                  }                  ans += a[i].len;              }              printf("%d\n", ans);          }          return 0;  }  


0 0
原创粉丝点击