HDU7050.Link with Limit(有向图tarjan找环)

简介: HDU7050.Link with Limit(有向图tarjan找环)

原题链接

思路:

x>f(x)建图,看每个环的平均值是否相同。

代码:

const int maxn=2e5+7,maxm=2e5+7;
ll n;
ll h[maxn],e[maxm],ne[maxm],idx,f[maxn],w[maxn];
ll dfn[maxn],low[maxn],timetamp,belong[maxn];
stack<int>stk;
bool st[maxn];
ll scc_cnt;
void init(){
  memset(h,-1,sizeof h);
  memset(w,0,sizeof w);
  memset(dfn,0,sizeof dfn);
  memset(low,0,sizeof low);
  memset(belong,0,sizeof belong);
  memset(st,0,sizeof st);
  idx=scc_cnt=timetamp=0;
}
void add(ll a,ll b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u){
    dfn[u]=low[u]=++timetamp;
    stk.push(u);st[u]=1;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!dfn[j]){
            tarjan(j);
            low[u]=min(low[u],low[j]);
        }
        else if(st[j]) low[u]=min(low[u],dfn[j]);
    }
    if(dfn[u]==low[u]){
        ++scc_cnt;
        int y;
        do{
            y=stk.top();
            stk.pop();
            belong[y]=scc_cnt;
            st[y]=0;
        }while(y!=u);
    }
}
vector<int>g[maxn];
int main(){
  int _=read;
  while(_--){
    init();
    n=read;
    rep(i,1,n){
      f[i]=read;
      add(i,f[i]);
      g[i].clear();
    }
    rep(i,1,n) if(!dfn[i]) tarjan(i);
    rep(i,1,n) 
      w[belong[i]]+=f[i],g[belong[i]].push_back(i);
    ll resp=-1,resq=-1,flag=1;
    vector<int>v;
    rep(i,1,scc_cnt){
      if(g[i].size()==1){
        if(g[i][0]==f[g[i][0]]){
          if(resp==-1){
            resp=1,resq=w[i];
          }
          else{
            if(resp*w[i]!=resq*1){
              flag=0;break;
            }
          }
        }
      }
      else if(g[i].size()>1) {
        if(resp==-1){
            resp=g[i].size(),resq=w[i];
          }
          else{
            if(resp*w[i]!=resq*g[i].size()){
              flag=0;break;
            }
          }
      }
    }
    if(flag) puts("YES");
    else puts("NO");    
  }
  return 0;
}
目录
相关文章
|
负载均衡 Java API
【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
482 0
|
安全 网络协议 网络安全
活动实践 | 低代码高效构建企业门户网站
本方案介绍如何使用魔笔平台快速构建和部署企业网站。通过DNS解析与Mobi平台建立SSL加密连接,确保数据安全传输。魔笔提供丰富的组件库和拖拽式界面设计工具,简化开发流程,支持快速开发、易于学习和安全可靠的特点。首次使用需登录魔笔控制台开通功能,并通过ROS控制台一键部署模板。编辑网站时,可轻松添加组件、管理后台数据并发布更新。最后,可通过资源栈页面清理不再需要的资源,确保环境整洁。
|
存储 开发工具 数据安全/隐私保护
「Mac畅玩鸿蒙与硬件9」鸿蒙开发环境配置篇9 - 使用Git进行版本控制
在 HarmonyOS 项目开发中,Git 版本控制可以帮助开发者规范地管理代码变更,确保协作流程顺畅。本篇将详细介绍从创建项目、提交代码到 Git 远程仓库,再到修改、推送更新的完整操作流程,重点演示如何使用 Git 和 GitHub 进行身份验证和版本管理。
680 3
「Mac畅玩鸿蒙与硬件9」鸿蒙开发环境配置篇9 - 使用Git进行版本控制
|
Python
Python办公自动化:删除任意页数pdf页面
Python办公自动化:删除任意页数pdf页面
402 2
Python办公自动化:删除任意页数pdf页面
|
存储 机器学习/深度学习 异构计算
Transformers 4.37 中文文档(十九)(8)
Transformers 4.37 中文文档(十九)
783 2
|
机器学习/深度学习 人工智能 监控
如何利用AI实现银行存量客户的营销?
金融行业是当今大数据、人工智能应用最广、最深的领域之一。随着数据仓库和数据科学的发展,以银行为代表的金融行业企业拥有了海量数据,应运而生了金融领域的大数据分析、智能营销等大数据和人工智能的应用。其中针对存量客户的智能营销成为银行业的一项重要策略。
|
存储 JSON 数据处理
分析、总结Python使用列表、元组、字典的场景
分析、总结Python使用列表、元组、字典的场景
410 0
|
运维 开发工具 C#
总结两种使用OpenCv连接海康相机播放视频画面方法
总结两种使用OpenCv连接海康相机播放视频画面方法
2789 0
|
存储 NoSQL 容灾
怎样保证Redis 保证数据不丢失?
Redis 数据不丢失主要靠持久化(RDB、AOF、混合)和集群运行(主从同步、哨兵、Cluster)。RDB是快照,恢复速度快但可能丢失部分数据;AOF记录所有命令,实时性好但写性能较低;混合持久化结合两者优点。集群通过多服务器分布数据,提高可用性和数据安全性。
564 5