标签:java int topo bitset aw new import path 可达性
N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量(1≤N,M≤30000)
import java.util.*;
import java.math.*;
import java.io.*;
class Solution {
int n,m,in[],path[],k;
List<Integer> g[];
BitSet f[];
boolean vis[];
void topo() {
Queue<Integer> q=new LinkedList<>();
for (int i=1; i<=n; i++) if (in[i]==0)
q.add(i);
while (!q.isEmpty()) {
int u=q.poll();
path[k++]=u;
for (int v : g[u]) if (--in[v]==0) {
q.add(v);
}
}
}
void init() throws IOException {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n=sc.nextInt(); m=sc.nextInt(); in=new int[n+1]; vis=new boolean[n+1];
g=new ArrayList[n+1]; f=new BitSet[n+1]; path=new int[n+1];
for (int i=1; i<=n; i++) {
g[i]=new ArrayList<>();
f[i]=new BitSet();
}
for (int i=0; i<m; i++) {
int u=sc.nextInt(), v=sc.nextInt();
g[u].add(v); in[v]++;
}
topo(); //topo序就是一条有向的相邻结点可达的路径
for (int i=k-1; i>=0; i--) { //从后往前遍历topo序上的点
int u=path[i]; //u的后继结点v能到的点,u也能到达
f[u].set(u); //自己能到达自己
for (int v : g[u]) {
f[u].or(f[v]);
}
}
for (int i=1; i<=n; i++) System.out.println(f[i].cardinality());
}
}
public class Main{
public static void main(String[] args) throws IOException {
Solution s = new Solution();
s.init();
}
}
标签:java,int,topo,bitset,aw,new,import,path,可达性 来源: https://www.cnblogs.com/wdt1/p/13899643.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。