当前位置: 首页 > ds >正文

【图论】拓扑排序

模板 B3644

在这里插入图片描述

BFS

const int N=2e5+10,mod=998244353,M=2e5+10;
int n,m;
vector<int>v[N],tp;
int din[N];
void toposort(){queue<int>q;forr(i,1,n)if(din[i]==0)q.push(i);while (q.size()){int x=q.front();tp.push_back(x);q.pop();for(auto i:v[x]){if(--din[i]==0)q.push(i);//把入度为0的点都放进q等待遍历}}
}
void solve(){cin>>n;forr(i,1,n){int a;while (cin>>a&&a){v[i].push_back(a);din[a]++;}}toposort();for(auto i:tp)cout<<i<<' ';
}

DFS

int n,m;
vector<int>v[N],tp;
int c[N];
void dfs(int x){c[x]=-1;//在路上的都赋值for(auto i:v[x]){if(c[i]==0)dfs(i);//进入还没走过的路径}c[x]=1;//走完的记录tp.push_back(x);return;
}
void toposort(){memset(c,0,sizeof c);forr(i,1,n){if(c[i]==0)dfs(i);for(auto i:tp)cout<<i<<' ';cout<<endl;}reverse(tp.begin(),tp.end());//dfs 先返回的是儿子节点 最后要逆转
}
void solve(){cin>>n;forr(i,1,n){int a;while (cin>>a&&a){v[i].push_back(a);}}toposort();for(auto i:tp)cout<<i<<' ';
}

把题意抽象成图

P4089

每个点只有一个出度

int n;
vector<int>tp;//存所有入度为0的点,不成环
int din[N],a[N];
void bfs(){queue<int>q;forr(i,1,n)if(din[i]==0)q.push(i);while (q.size()){int x=q.front();tp.push_back(x);q.pop();if(--din[a[x]]==0)q.push(a[x]);//把入度为0的点都放进q等待遍历}
}
void solve(){cin>>n;forr(i,1,n){cin>>a[i];din[a[i]]++;}bfs();cout<<n-tp.size()<<endl;
}

GDCPC 2024 不等式

在这里插入图片描述

const int N=2e5+10,mod=998244353,M=2e5+10;
struct pr
{int b,c;
};
int n,m;
int ans,sz;
set<int>v[N];
vector<pr>sm[N];
int din[N],val[N];void toposort(){queue<int>q;forr(i,1,n)if(!din[i])q.push(i);while (q.size()){int x=q.front();q.pop();sz++;for(auto i:v[x]){if(--din[i]==0)q.push(i);}val[x]=1;for(auto i:sm[x]){val[x]=max(val[x],val[i.b]+val[i.c]);}ans+=val[x];}}
void solve(){cin>>n>>m;forr(i,1,m){int x,y,z;cin>>x>>y>>z;sm[x].push_back({y,z});if(!v[y].count(x)){v[y].insert(x);din[x]++;}if(!v[z].count(x)){v[z].insert(x);din[x]++;}}toposort();cout<<(ans>1e9||sz<n?-1:ans)<<endl;
}

XJTUPC2024 雪中楼 把题意抽象成图

抽象成一个链表,矮的后继高的
给的aia_iaiiii矮,ai→ia_i\rightarrow iaii
指向相同前驱的点,编号越小越高,把树变链表

int n;
vector<int>v[N];
int a[N];
void bfs(){queue<int>q;forr(i,1,n)if(din[i]==0)q.push(i);while (q.size()){int x=q.front();tp.push_back(x);q.pop();if(--din[a[x]]==0)q.push(a[x]);//把入度为0的点都放进q等待遍历}
}
void solve(){cin>>n;forr(i,1,n){cin>>a[i];v[a[i]].push_back(i);//矮的指向高的}int nw=0;forr(i,1,n){//指向同一个点的 序号越小越高sort(v[nw].begin(),v[nw].end(),greater<int>());//z序号越小越高 序号从大到小while (v[nw].size()>1)//把高的都归位{int h=v[nw].back();v[nw].pop_back();int l=v[nw].back();v[l].push_back(h);}nw=v[nw].front();}nw=0;forr(i,1,n){if(v[nw].size()){cout<<v[nw].front()<<' ';nw=v[nw].front();}}}

带权值遍历DAG

P1038 神经网络

const int N=110,mod=998244353,M=2e5+10;
int n,m;
vector<int>v[N],e[N];
int din[N],dout[N],w[N][N],u[N],c[N];void toposort(){queue<int>q;forr(i,1,n)if(!din[i])q.push(i);while (q.size()){int x=q.front();q.pop();int sm=0;for(auto j:v[x]){if(c[x]>0)c[j]+=w[x][j]*c[x];if(!--din[j])q.push(j);}}
}
void solve(){cin>>n>>m;forr(i,1,n){cin>>c[i]>>u[i];if(c[i]==0)c[i]-=u[i];}forr(i,1,m){int x,y,wv;cin>>x>>y>>wv;w[x][y]=wv;v[x].push_back(y);din[y]++,dout[x]++;}toposort();int fg=0;forr(i,1,n){if(!dout[i]&&c[i]>0)cout<<i<<' '<<c[i]<<endl,fg=1;}if(!fg)cout<<"NULL"<<endl;
}
http://www.xdnf.cn/news/18429.html

相关文章:

  • 【考研408数据结构-09】 图论进阶:最短路径与最小生成树
  • 盲盒商城h5源码搭建可二开幸运盲盒回收转增定制开发教程
  • 整体设计 之定稿 “凝聚式中心点”原型 --整除:智能合约和DBMS的在表层挂接 能/所 依据的深层套接
  • YAML格式笔记
  • Linux-----《Linux系统管理速通:界面切换、远程连接、目录权限与用户管理一网打尽》
  • Download:几款主流的全球范围的NDVI产品参数说明和下载
  • 领码方案:通用物联网数据采集低代码集成平台——万物智联时代的黄金钥匙
  • 电梯RFID楼层状态采集器的功能需求及参数要求,以下为多奥综合技术解析与参数说明,整合了十几年项目相关技术指标及应用场景:
  • 【java面试day16】mysql-覆盖索引
  • 签名应用APP分发平台的微服务化部署是什么?其有哪些优势?
  • LoRa 网关与节点组网方案
  • Linux I/O 多路复用实战:Select/Poll 编程指南
  • ansible中roles角色是什么意思?
  • 2026 年越南未来能源展
  • 数据清洗(Data Cleansing)——机器学习深度学习所需数据的清洗实战案例 (结构清晰、万字解析、完整代码)包括机器学习方法预测缺失值的实践
  • webrtc弱网-GoogCcNetworkController类源码分析与算法原理
  • MyBatis-Plus基础篇详解
  • Kubernetes 的 YAML 配置文件-kind
  • vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
  • ubuntu24.04 用apt安装的mysql修改存储路径(文件夹、目录)
  • 【CUDA教程--3】通过简单的矩阵运算入门CUDA
  • C# NX二次开发:操作按钮控件Button和标签控件Label详解
  • 华为鸿蒙系统SSH如何通过私钥连接登录
  • RadioIrqProcess函数详细分析与流程图
  • for-else 流程控制结构介绍
  • 3、栈和队列
  • LG P3710 方方方的数据结构 Solution
  • 指针的应用学习日记
  • 算法训练营day55 图论⑤ 并查集理论基础、107. 寻找存在的路径
  • 信号和共享内存