专栏文章
搜索应用小结
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mir2ou7o
- 此快照首次捕获于
- 2025/12/04 14:46 3 个月前
- 此快照最后确认于
- 2025/12/04 14:46 3 个月前
判环
几大判环方法:
DFS(有向图):
CPPvoid check(int u){
use[u]=1;
for(int i:g[u]){
if(use[i]==1){
f=1;
return ;
}
if(use[i]==0)check(i);
}
use[u]=2;
}
拓扑排序:
CPPbool check(){
for(int i=0;i<n;i++){
rd[i]=0;
g[i].clear();
}
for(int i=1;i<=m;i++){
g[u[i]].push_back(v[i]);
rd[v[i]]++;
}
queue<int>q;
int cnt=0;
for(int i=0;i<n;i++){
if(rd[i]==0)q.push(i),cnt++;
}
while(!q.empty()){
int pos=q.front();
q.pop();
for(int i:g[pos]){
if(--rd[i]==0)q.push(i),cnt++;
}
}
if(cnt!=n)return 0;
else return 1;
}
SPFA(判负环):
CPPbool spfa() {
for(int i=1;i<=n;i++){
q.push(i);
vis[i]=true;
}
while(!q.empty()) {
int x=q.front();
q.pop();
vis[x]=0;
for(pii i:g[x]) {
if(dis[i.first]>dis[x]+i.second){
dis[i.first]=dis[x]+i.second;
cnt[i.first]=cnt[x]+1;
if(cnt[i.first]>=n)return true;
if(!vis[i.first]){
vis[i.first]=1;
q.push(i.first);
}
}
}
}
return false;
}
实际上,在正式的应用中,除了负权环之外,比较常用的是DFS和SPFA。一般而言,DFS可以快速知道具体每个点在不在环上,但是拓扑排序可以知道整个图有没有环,而且可以知道整个图中没有在环上的点的总数。
比如可以用拓扑排序的题https://www.luogu.com.cn/problem/AT_abc296_e
可以用DFS判环的题https://www.luogu.com.cn/problem/CF936B
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...