本题解析:
本题要求的是从每个点出发能到达距离最远的点
法一: 反向建边
那么我们是不是可以把这个问题转化成 编号大能不能到达你这个点 那么就可以直接从编号最大的点开始反向找即可 由于是有向图 那么就要求反向建图比如说原本从A->B变成B->A即可 反向建边后遍历一下即可
法二:图的强连通分量
未完待续
题目描述
给出N个点,M条边的有向图,对于每个点v,求A(v)表示从点v出发,能到达的编号最大的点。
样例
输入:
4 3
1 2
2 4
4 3
输出:
4 4 3 4
样例解释: 4个点 3条边 4->3 1->2 2->4 4->3
连成图就是1->2->4->3 单向边 从1出发最大可以到4 从2出发最大可以到4 从3出发最大可以到3 从4出发最大可以到4
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int A[N];
vector<int> G[N];
void dfs(int x,int d)
{
if(A[x]) return ;
A[x]=d;
for(int i=0;i<G[x].size();i++)
dfs(G[x][i],d);
}
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int n,m;
cin>>n>>m;
G[m].push_back(n);
}
for(int i=n;i;i--) dfs(i,i);
for(int i=1;i<=n;i++) cout<<A[i]<<" ";
return 0;
}