题目描述
给出N个点,M条边的有向图,对于每个点v,求A(v)表示从点v出发,能到达的编号最大的点。
输入格式
第1 行,2 个整数N,M。
接下来MM行,每行2个整数Ui,Vi,表示边(Ui,Vi)。点用1,2,⋯,N编号。
输出格式
N 个整数A(1),A(2),⋯,A(N)。
输入输出样例
输入 #14 3 1 2 2 4 4 3输出 #1
4 4 3 4
说明/提示
• 对于60% 的数据,10^31≤N.M≤103;
• 对于100% 的数据,10^51≤N,M≤105。
分析:
深度优先遍历
(1)任选G中某个未被访问的顶点v,访问v
(2)以与v相关联的每一个未被访问过的顶点w出发深度优先遍历G
(3)若G中还有未被访问的顶点,则转(1)否则遍历终止。
//图的遍历 #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn=1e5+10; int vis[maxn],ans[maxn],head[maxn],cnt=0,n,m,temp=0; //vis记录是否遍历过 struct n { int to,next; }e[maxn]; void add(int u,int v) { e[cnt].to=v;//指向谁 e[cnt].next=head[u]; head[u]=cnt++; } void dfs(int u) { vis[u]=1; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; if(!vis[v]) dfs(v); } ans[u]=temp; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { head[i]=-1; ans[i]=i; } for(int i=1,a,b;i<=m;i++) { cin>>a>>b; add(b,a); } for(int i=n;i>=1;i--) { if(!vis[i]) { temp=i; dfs(i); } } for(int i=1;i<=n;i++) { cout<<ans[i]<<" "; } return 0; }
标签:cnt,遍历,int,dfs,vis,maxn 来源: https://www.cnblogs.com/VonSafen/p/16336039.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。