當前位置:
首頁 >
poj Going from u to v or from v to u? 强联通缩点+拓扑排序(或搜索)
發布時間:2023/12/10
43
豆豆
生活随笔
收集整理的這篇文章主要介紹了
poj Going from u to v or from v to u? 强联通缩点+拓扑排序(或搜索)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
方法一
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> //#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1024; struct Edge {int s,t; }; int n,m,dfn[N],low[N],in[N],id[N],cnt,dep,mp[N][N]; vector<Edge>edge; vector<int>g[N]; stack<int>st;void Addedge(int u,int v) {Edge tp;tp.s=u,tp.t=v;edge.push_back(tp);g[u].push_back(edge.size()-1); }void dfs(int u) {int v,i,k,mx=dfn[u]=low[u]=dep++;st.push(u);for(i=0;i<g[u].size();i++){v=edge[g[u][i]].t;if(dfn[v]==-1) dfs(v);if(mx>low[v]) mx=low[v];}if(mx<low[u]){low[u]=mx;return ;}//printf("%d\n",cnt);do{k=st.top();st.pop();id[k]=cnt;low[k]=n;}while(k!=u);cnt++; }void dfs1(int u,int q) {dfn[u]=1;dep=max(dep,q);for(int i=0;i<cnt;i++){if(mp[u][i]==1)dfs1(i,q+1);} } int main() {//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int _,i,u,v;scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);for(i=0; i<n; i++){g[i].clear();id[i]=i;}edge.clear();for(i=0; i<m; i++){scanf("%d%d",&u,&v);Addedge(u-1,v-1);}dep=0;cnt=0;while(!st.empty()) st.pop();memset(dfn,0xff,sizeof(dfn));for(i=0; i<n; i++){if(dfn[i]==-1)dfs(i);}memset(in,0,sizeof(in));memset(mp,0,sizeof(mp));for(i=0; i<m; i++){u=id[edge[i].s];v=id[edge[i].t];//printf("%d %d\n",u,v);if(u!=v){in[v]++;mp[u][v]=1;}}memset(dfn,0,sizeof(dfn));for(i=0,dep=0;i<cnt;i++){if(dfn[i]==0) dfs1(i,1);}if(dep==cnt) printf("Yes\n");else printf("No\n");}return 0; }方法二
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> //#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1024; struct Edge {int s,t; }; int n,m,dfn[N],low[N],in[N],id[N],cnt,dep,mp[N][N]; vector<Edge>edge; vector<int>g[N]; stack<int>st;void Addedge(int u,int v) {Edge tp;tp.s=u,tp.t=v;edge.push_back(tp);g[u].push_back(edge.size()-1); }void dfs(int u) {int v,i,k,mx=dfn[u]=low[u]=dep++;st.push(u);for(i=0;i<g[u].size();i++){v=edge[g[u][i]].t;if(dfn[v]==-1) dfs(v);if(mx>low[v]) mx=low[v];}if(mx<low[u]){low[u]=mx;return ;}//printf("%d\n",cnt);do{k=st.top();st.pop();id[k]=cnt;low[k]=n;}while(k!=u);cnt++; }int topsort() {int i,u,v,p;stack<int>S;for(i=0;i<cnt;i++){//printf("%d\n",in[i]);if(in[i]==0)S.push(i);}//printf("%d\n",S.size());p=0;while(S.size()==1){u=S.top();S.pop();p++;for(i=0;i<cnt;i++){if(mp[u][i]==1){in[i]--;if(in[i]==0) S.push(i);}}}if(p==cnt) return 1;else return 0; }int main() {//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int _,i,u,v;scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);for(i=0; i<n; i++){g[i].clear();id[i]=i;}edge.clear();for(i=0; i<m; i++){scanf("%d%d",&u,&v);Addedge(u-1,v-1);}dep=0;cnt=0;while(!st.empty()) st.pop();memset(dfn,0xff,sizeof(dfn));for(i=0; i<n; i++){if(dfn[i]==-1)dfs(i);}memset(in,0,sizeof(in));memset(mp,0,sizeof(mp));for(i=0; i<m; i++){u=id[edge[i].s];v=id[edge[i].t];if(u!=v&&!mp[u][v]){in[v]++;mp[u][v]=1;}}if(topsort()) printf("Yes\n");else printf("No\n");}return 0; }版權聲明:本文為博主原創文章,未經博主允許不得轉載。http://xiang578.top/
轉載于:https://www.cnblogs.com/xryz/p/4847783.html
總結
以上是生活随笔為你收集整理的poj Going from u to v or from v to u? 强联通缩点+拓扑排序(或搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dart基础学习02--变量及内置类型
- 下一篇: 如何配置一个最基本的web富文本编辑器?