重点在于加入入度为0的点,把前驱的边先去掉,进行处理/
如何想到运用?
需要用到,建立一个邻接表
int n=quiet.length;
int[]in=new int[in];
List<Integer>list[]=new List[n];
int[]ans=new int [n];
for(int i=0;i<n;i++){
list[i]=new ArrayList<>();
ans[i]=i;
如果一个问题中需要将比较类的二维数组进行有向比较,并且需要通过另一个值的大小进行比较,这个时候就需要用邻接表进行处理
for(int i=0;i<richer.length;i++){
int u=richer[i][0];
intv=recher[i][1];
in[v]++;
list[u].add(v);
此时将u与v建立的表进行了链接.
这时就要进行拓扑查询
Queue<Integer>Q=new ArrayDeque<>();
此时需要加入入度为0的点,这时添加入排位
for(int i=0;i<n;i++){
if(in[i]==0)Q.add(i);}
更新堆中的元素
while(!Q.isEmpty())[
int u=Q.poll();//将堆顶元素去除
for(int v:list[u]){
if(quiet[ans[u]]<quiet[ans[v]])
ans[v]=ans[u];
in[v]--;
if(in[v]==0){
Q.add(v);}}}return ans}