拓扑排序使用List<List>存储关系,即稀疏矩阵

package tt;
import java.util.*;
public class Linjiebiao {
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()) {
            int n=in.nextInt();
            int m=in.nextInt();
            int du[]=new int[n+1];
            List<ArrayList<Integer>> map=new ArrayList<ArrayList<Integer>>();  //使用嵌套的list存储关系矩阵,对于稀疏矩阵来说很节省空间
            //初始化map,全是空
            for(int i=0;i<=n;i++) {
                map.add(new ArrayList());
            }
            //对输入的关系矩阵做处理
            for(int i=1;i<=m;i++) {
                int x=in.nextInt();
                int y=in.nextInt();
                List temp=map.get(x);
                int flag=1;
                for(int j=0;j<temp.size();j++) {
                    if((int)temp.get(j)==y) {
                        flag=0;
                        break;
                    }
                }
                if(flag==1) {
                    temp.add(y);
                    du[y]+=1;
                    map.set(x,new ArrayList(temp));//更新原来的状态值,注意此处使用list.set(index,value)函数,更新了index处的索引
                }
            }
            //拓扑排序
            int cnt=0;
            Queue<Integer> queue=new LinkedList<Integer>();
            Queue<Integer> ans=new LinkedList<Integer>();
            for(int i=1;i<=n;i++) {
                if(du[i]==0) {
                    queue.add(i);
                    ans.add(i);
                    du[i]=-1;
                    cnt++;
                }
            }
            while(queue.size()>0) {
                int tnum=(int)queue.poll();
                List tlist2=map.get(tnum);
                for(int i=0;i<tlist2.size();i++) {
                    du[(int)tlist2.get(i)]--;
                }
                for(int i=1;i<=n;i++) {
                    if(du[i]==0) {
                        queue.add(i);
                        ans.add(i);
                        du[i]=-1;
                        cnt++;
                    }
                }
            }
            if(cnt!=n) {
                System.out.println("存在环");
            }else {
                int flag2=1;
                while(ans.size()>0) {
                    if(flag2==1) {
                        System.out.print(ans.poll());
                    }else {
                        System.out.print(" "+ans.poll());
                    }
                    System.out.println();
                }
            }
        }
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值