题意:
给一张有向图G,求一个结点数最大的结点集,使得该结点集中任意两个结点u和v满足,要么u可以到达v,要么v可以达到u。
思路:
找到SCC后进行缩点建图,每个点的权值则为其连通分量的点数,这样就是找DAG上一条最大路径,DP解决。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std; 10 11 const int maxn=1000+5; 12 13 int n,m; 14 15 vector G[maxn]; 16 int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt; 17 int num[maxn]; 18 int map[maxn][maxn]; 19 int d[maxn]; 20 stack S; 21 22 void dfs(int u) 23 { 24 pre[u]=lowlink[u]=++dfs_clock; 25 S.push(u); 26 for(int i=0;i