其实发这边文章的主要目的就是想分享一下Scanner函数,
与其一个一个从键盘接受int值,例如 int a = scanner.nextInt();还不如直接用String 获取一行,然后在给数组赋值
类似于这样:String s = in.nextLine();
int aa = 0;
for(int j=1;j<=n;j++)
{
map[i][j]=((s.charAt(aa)-48)==1);
aa+=2;
}
这样会节省时间 具体为什么楼主也不知道。。。
当然需要输入的数字必须是个位数 原因你们懂得
下面上代码
package com.graph;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
public class Hamilton {
//竞赛图 :每对顶点之间都有一条边相连的有向图称为竞赛图。
void run() throws IOException{
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
boolean map[][] = new boolean[n+5][n+5];
int nxt[]=new int[n+5];//用来表示当前节点i的下一个节点就是nxt【i】;
int ans[]=new int[n+5];
String a = in.nextLine();
for(int i=1;i<=n;i++)
{
String s = in.nextLine();
int aa = 0;
for(int j=1;j<=n;j++)
{
map[i][j]=((s.charAt(aa)-48)==1);//输入数据 boolean类型;
aa+=2;
}
}
Arrays.fill(nxt, -1);
int h=1; //h代表第一个节点。
for(int i=2;i<=n;i++)
if(map[i][h]){
nxt[i]=h; //如果此时遍历的节点能到第一个节点 则把它挂在前面当做第一个节点。
h=i;
}
else{ //如果不能到达第一个节点 则在后面寻找出它能到达的节点 ,插入进去
int pre=h,pos=nxt[h];
while(pos!=-1&&!map[i][pos]){
pre=pos;
pos=nxt[pos];
}
nxt[pre]=i;
nxt[i]=pos;
}
int cnt=0;
for(int i=h;i!=-1;i=nxt[i])
ans[++cnt]=i; //得出输出队列
System.out.println("1\n"+n);
for(int i=1;i<n;i++)
System.out.print(ans[i]+" ");
System.out.println(ans[n]);
}
}
public static void main(String[] args) throws Exception
{
new Hamilton().run();
}
}