<pre class="html" name="code">有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
Input
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
Output
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
Sample Input
4 3
1 2
2 3
4 3
Sample Output
1 2 4 3
package cn.hncu.search;
import java.util.Scanner;
public class tapSeach1 {
static int n,m;
static int sorted[];
static int degree[];
static int arc[][];
static Scanner sc= new Scanner(System.in);
public static void main(String[] args) {
while(sc.hasNext()){
n=sc.nextInt();
m=sc.nextInt();
intit();
topsort();
}
}
private static void topsort() {
int s=0;
while(s<n){
int i=0;
for(;i<n;i++){
if(degree[i]==0&&sorted[i]==0){
break;
}
}
if(i==n){
System.out.println("图中有回路,题目无解!");
return;
}
sorted[i]=1;
s++;//控制输出
System.out.print(i+1);
if(s<n){
System.out.print(" ");
}
for(int j=0;j<n;j++){
if(arc[i][j]==1){
degree[j]--;
}
}
}
System.out.println();
}
// 初始化
private static void intit() {
sorted = new int [n];
degree=new int [n];
arc=new int[n][n];
for(int i=0;i<n;i++){
sorted[i]=0; //0 代表未排序,1代表排序了
degree[i]=0;//
for(int j=0;j<n;j++){
arc[i][j]=0;//0代表没有边i-->j,1代表有边
}
}
//画图
for(int i=0;i<m;i++){
int a=sc.nextInt()-1;
int b=sc.nextInt()-1;
if(arc[a][b]==0){
arc[a][b]=1;
degree[b]++;
}
}
}
}