华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1124|回复: 2
打印 上一主题 下一主题

P1525 关押罪犯

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-5-21 22:38:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1525

题目描述
S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。

那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

输入输出格式
输入格式:
输入文件的每行中两个数之间用一个空格隔开。第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证1<aj=<=bj<=N ,0 < cj≤ 1,000,000,000,且每对罪犯组合只出现一次。

输出格式:
共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。

输入输出样例
输入样例#1:
4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
输出样例#1:
3512
说明
【输入输出样例说明】罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。



【数据范围】对于30%的数据有N≤ 15。对于70%的数据有N≤ 2000,M≤ 50000。对于100%的数据有N≤ 20000,
回复

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
沙发
发表于 2018-7-30 00:03:42 | 只看该作者
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. int d[110000],n,m,fa[110000];
  14. struct node
  15. {
  16.         int u,v,w;
  17. }a[110000];
  18. bool cmp(node x,node y)
  19. {
  20.         return x.w>y.w;
  21. }
  22. int getf(int u)
  23. {
  24.         if(u==fa[u])
  25.                 return u;
  26.         int f=getf(fa[u]);
  27.         fa[u]=f;
  28.         return f;
  29. }
  30. bool check(int x,int y)
  31. {
  32.         if(getf(x)==getf(y))
  33.                 return true;
  34.         return false;
  35. }
  36. int main()
  37. {
  38.         scanf("%d%d",&n,&m);
  39.         for(int i=1;i<=m;i++)
  40.                 scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
  41.         sort(a+1,a+1+m,cmp);
  42.         for(int i=1;i<=n;i++)
  43.                 fa[i]=i;
  44.         for(int i=1;i<=m;i++)
  45.         {
  46.                 if(check(a[i].u,a[i].v))
  47.                 {
  48.                         printf("%d",a[i].w);
  49.                         return 0;
  50.                 }
  51.                 if(!d[a[i].u])
  52.                         d[a[i].u]=a[i].v;
  53.                 else
  54.                         fa[getf(a[i].v)]=getf(d[a[i].u]);
  55.                 if(!d[a[i].v])
  56.                         d[a[i].v]=a[i].u;
  57.                 else
  58.                         fa[getf(a[i].u)]=getf(d[a[i].v]);
  59.         }
  60.         printf("0");
  61.     return 0;
  62. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
板凳
发表于 2018-10-4 19:14:01 | 只看该作者
  1. #include<iostream>
  2. #include<algorithm>
  3. #define FOR(i,a,b) for(register int i=a;i<=b;i++)
  4. #define ROF(i,a,b) for(register int i=a;i>=b;i--)
  5. using namespace std;
  6. const int N=20005,M=100005;
  7. int n,m,f[N],d[N];
  8. struct node
  9. {
  10.     int a,b,c;
  11. }e[M];
  12. inline bool cmp(node x,node y){return x.c>y.c;}
  13. int getf(int q)
  14. {
  15.     if(f[q]==q)return q;
  16.     f[q]=getf(f[q]);
  17.     return f[q];
  18. }
  19. void Merge(int x,int y){f[getf(f[x])]=getf(f[y]);return;}
  20. int main()
  21. {
  22.     cin>>n>>m;
  23.     FOR(i,1,n)f[i]=i;
  24.     FOR(i,1,m)cin>>e[i].a>>e[i].b>>e[i].c;
  25.     sort(e+1,e+m+1,cmp);
  26.     FOR(i,1,m+1)
  27.     {
  28.         if(getf(e[i].a)==getf(e[i].b)){cout<<e[i].c<<endl;return 0;}
  29.         if(!d[e[i].a])d[e[i].a]=e[i].b;
  30.         else Merge(d[e[i].a],e[i].b);
  31.         if(!d[e[i].b])d[e[i].b]=e[i].a;
  32.         else Merge(d[e[i].b],e[i].a);
  33.     }
  34.     return 0;
  35. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 13:03 , Processed in 0.097435 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表