题面

解析

这题好像没人写过啊(所以好像没题解)...

然后刚了一天才写出来摆了半天.

其实一开始是想错了,

写了个\(O(n^2)\)的近似于暴力的方法.

就是对于每组权值相等的边,

对于每条边先把它假装删掉,

再看有没有边能代替它.

结果最后一个点过不去我绝对没想过打表.

后来发现有更好的方法.

我们先随便建一棵最小生成树,

对于那些没在树里的边,

我们发现一条边加进去就会形成一个环,

那么断开这个环里的一条边,它依然是一棵树.

所以这个环里所有权值相同的边都能互相替代.

而当环里的所有边的权值都比当前边小时,这条边就一定不会被选.

所以我们枚举不在树里的边,

暴力找环判断就行了.

(按理来说可能跑不过但就是过了还跑得挺快.)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int N=100005;
const int M=1000005;
struct edge{int x,y,w,id,tag;}a[N];
struct node{int to,next,id;}e[N<<1];
int n,m,ans[N];
int head[N],cnt;
int fa[N],s[M],f[M],dep[N],d[N],w[N]; inline bool cmp(edge a,edge b){return a.w<b.w;} inline int find(int x){return fa[x]==x? x:fa[x]=find(fa[x]);} inline void add(int x,int y,int id){
e[++cnt]=(node){head[x],y,id};head[x]=cnt;
} inline void dfs(int x,int fa){
dep[x]=dep[fa]+1;d[x]=fa;
for(int i=head[x];i;i=e[i].to){
int k=e[i].next;
if(k!=fa) w[k]=e[i].id,dfs(k,x);
}
} int main(){
// freopen("123.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++) a[i].x=read(),a[i].y=read(),a[i].w=read();
for(int i=1;i<=m;i++) a[i].id=i;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++) s[a[i].w]++;
for(int i=1;i<=m;i++){
int fx=find(a[i].x),fy=find(a[i].y);
if(fx==fy) continue;
fa[fx]=fy;f[a[i].w]++;a[i].tag=1;
add(a[i].x,a[i].y,i);add(a[i].y,a[i].x,i);
}
for(int i=1;i<=m;i++){
if(!f[a[i].w]) ans[a[i].id]=0;
else ans[a[i].id]=2;
}
dfs(1,0);
for(int i=1;i<=m;i++){
// if(a[i].id==573) cout<<"ok"<<endl;
if(a[i].tag) continue;
if(!f[a[i].w]) continue;
ans[a[i].id]=1;
// if(a[i].id==573) cout<<"ok"<<endl;
int x=a[i].x,y=a[i].y,ok=0;
if(dep[x]<dep[y]) swap(x,y);
for(;dep[x]>dep[y];x=d[x]){ if(a[i].w==a[w[x]].w) ans[a[w[x]].id]=1,ok=1;}
for(;x!=y;x=d[x],y=d[y]){
if(a[i].w==a[w[x]].w) ans[a[w[x]].id]=1,ok=1;
if(a[i].w==a[w[y]].w) ans[a[w[y]].id]=1,ok=1;
}
if(!ok) ans[a[i].id]=0;
}
for(int i=1;i<=m;i++){
if(ans[i]==0) puts("none");
else if(ans[i]==1) puts("at least one");
else if(ans[i]==2) puts("any");
}
return 0;
}

题解 [51nod1771] 最小生成树中的边的更多相关文章

  1. POJ 2395 Out of Hay(最小生成树中的最大长度)

    POJ 2395 Out of Hay 本题是要求最小生成树中的最大长度, 无向边,初始化es结构体时要加倍,别忘了init(n)并查集的初始化,同时要单独标记使用过的边数, 判断ans==n-1时, ...

  2. POJ 2485 Highways (求最小生成树中最大的边)

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...

  3. POJ2395 Out of Hay(求最小生成树中最大的边权,Kruskal)

    POJ2395 Out of Hay 寻找最小生成树中最大的边权. 使用 Kruskal 求解,即求选取的第 \(n-1\) 条合法边. 时间复杂度为 \(O(e\log e)\) . #includ ...

  4. POJ-2349(kruskal算法+最小生成树中最大边的长度)

    Arctic POJ-2349 这题是最小生成树的变形题目.题目的意思是已经有s个卫星频道,这几个卫星频道可以构成一部分的网络,而且不用费用,剩下的需要靠d的卫星接收器.题目要求的就是最小生成树中,最 ...

  5. LeetCode题解 | 215. 数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  6. leetCode 题解之字符串中第一个不重复出现的字符

    1.题目描述 Given a string, find the first non-repeating character in it and return it's index. If it doe ...

  7. HDU 3228 题解(最小生成树)(Kruskal)(内有详细注释)

    Problem Description A group of explorers has found a solitary island. They land on the island and ex ...

  8. poj 2485 求最小生成树中 最长的一条边

    Sample Input 1 //T 3 //n0 990 692 //邻接矩阵990 0 179692 179 0Sample Output 692 prim # include <iostr ...

  9. POJ 2349 Arctic Network(最小生成树中第s大的边)

    题目链接:http://poj.org/problem?id=2349 Description The Department of National Defence (DND) wishes to c ...

随机推荐

  1. HanLP-命名实体识别总结

    人名识别 在HanLP中,基于角色标注识别了中国人名.首先系统利用隐马尔可夫模型标注每个词语的角色,之后利用最大模式匹配法对角色序列进行匹配,匹配上模式的即为人名.理论指导文章为:<基于角色标注 ...

  2. spring security中Authority、Role的区别

    最近在研究spring security时,大概研究了一下Authority.Role之间到底有什么本质的区别. 如果你使用的是hasRole方法来判断你的登录用户是否有权限访问某个接口,那么你初始化 ...

  3. Oracle数据库连接工具的使用(一)

    一.企业管理器(OEM) 1.介绍 Oracle企业管理器(Oracle Enterprise Manager)简称OEM,是一个基于Java的框架系统,该系统集成了多个组件,为用户提供了一个功能强大 ...

  4. 记录一次hadoop2.8.4版本RM接入zk ha问题

    背景: 公司将线上hadoop RM接入ZK 实现高可用 但ZK Znode 默认存储1M,当存储数据量大时候可能导致线上业务的崩溃 处理方案如下: 1,修改ZK配置 增加默认存储上限 2,修改RM数 ...

  5. Chrome浏览器控制台报 POST http://*** net::ERR_BLOCKED_BY_CLIENT

    开发项目广告模块时,遇到前端提交的请求后台拿不到,好像被什么拦截了,查看了过滤器,拦截器都无错误,且请求也到不了拦截器,chrome浏览器报:ERR_BLOCKED_BY_CLIENT错误 搞腾一半天 ...

  6. ubuntu18上传代码到github

    其实在github上建仓库时候就提示你步骤了: 1.注册个github账号并登录 创建一个仓库 https://github.com/ 2.创建SSH Key ssh-keygen -t rsa -C ...

  7. LC 387. First Unique Character in a String

    题目描述 Given a string, find the first non-repeating character in it and return it's index. If it doesn ...

  8. 初识php语法

    初到一家php公司,由于之前做的java,现在记录一些学习php中的语法细节. =>的用法 => 是数组成员访问符号.在php中数组默认键名是整数,也可以自己定义任意字符键名(最好是有实际 ...

  9. 如何使用JDBC连接数据库

    1 JDBC:java database connectivity,是java程序与数据库系统通信的标准api 2 下载mysql JDBC驱动,解压缩找到mysql-connector-java-5 ...

  10. LLVM新建全局变量

    在LLVM中,有原生的AST Clone,却没有一个比较好的Stmt copy功能,基于Scout在LLVM上进行的修改,我们实现了自己的Stmt Clone功能. 要进行Stmt Clone,肯定需 ...