题目木:
分析:竟然被难住了:
第一次的代码:
int dfs(int x)
{
if(D[x]!=-1) return D[x];
A[x]=1;
D[x]=x;
for(int i=0;i<vv[x].size();i++)
{
D[x]=max(D[x],dfs(vv[x][i]));
}
return D[x];
}
不对,不能处理有环的情况。
又想到了并查集。无果。
弟弟在此,请受一拜:
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n;
vector<vector<int> > vv;
int A[100005];//1用过 0没有用过
int D[100005];
void dfs(int x,int cc)
{
if(D[x]!=-1) return ;
D[x]=cc;
for(int i=0;i<vv[x].size();i++)
{
dfs(vv[x][i],cc);
}
}
int main()
{
memset(A,0,sizeof(A));
memset(D,-1,sizeof(D));
cin>>n>>m;//n个点 m条边
vector<int> v;
for(int i=0;i<=n;i++)
{
vv.push_back(v);
}
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
vv[b].push_back(a);
}
for(int i=n;i>=1;i--)
{
dfs(i,i);
}
for(int i=1;i<=n;i++)
{
cout<<D[i]<<' ';
}
}