题目大意:给出一张无向图,再给出几组点集,问每组点集中,所有点到点的最短路径,是否走过了所有的点。
该题分两个部分:
1.用Floyd算法,记录整个图的任意两点间最短路径的距离。然后再通过上述的二维数组来判断任意两点间到底经过了哪些点。
代码解释: floyd记录的->map[i][j] 记录从i到j经过多少点的三位数组->set[i][j][k]
由floyd算法我们可知,map[i][j]=map[i][k]+map[k][j]; 那么如果满足这个相等条件的,则表明,k肯定在i->j的路径上,那么这时,把set[i][j][k]置1,表示在i->j路径上,k点是会被经过的
2.接收需要检查的点集,检查任意两点间的路径,即检查set[i][j][k] 如果值为1,则表明此点被经过了,那么vis[]数组记录下。最后遍历vis,如果全是1,则所有点经过了。
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static Scanner sc = new Scanner(System.in);
static int t,n,cnt;
static final int MAX=99999999;
static String s;
static String [] str;
static int [][] map;
static int [][][] set;
static int [] vis;
static void floyd() {
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(map[i][j]==map[i][k]+map[k][j])
set[i][j][k]=1;
}
}
}
}
public static void main(String[] args) {
int len;
n=sc.nextInt();
map=new int[n+1][n+1];
set=new int[n+1][n+1][n+1];
vis=new int[n+1];
for(int i=1;i<=n;i++)
Arrays.fill(map[i],MAX);
sc.nextLine();
for(int i=1;i<=n;i++) {//initial
map[i][i]=0;
s=sc.nextLine();
str=s.split(" ");
len=str.length;
for(int j=0;j<len;j++) {
map[i][Integer.parseInt(str[j])]=1;
}
}
floyd();
//
// for(int i=1;i<=n;i++) {
// for(int j=1;j<=n;j++) {
// System.out.print(map[i][j]+" ");
// }
// System.out.println();
// }
// System.out.println(map[1][5]==map[1][3]+map[3][5]);
// System.out.println(set[1][5][3]);
t=sc.nextInt();
sc.nextLine();
int tlen,jj,kk;
for(int i=0;i<t;i++) {
s=sc.nextLine();
str=s.split(" ");
Arrays.fill(vis, 0);cnt=0;
tlen=str.length;
for(int j=0;j<tlen;j++) {
jj=Integer.parseInt(str[j]);
vis[jj]=1;
for(int k=0;k<tlen;k++) {
kk=Integer.parseInt(str[k]);
if(jj!=kk) {
// System.out.println(jj+"->"+kk);
for(int x=1;x<=n;x++) {
if(set[jj][kk][x]==1) {vis[x]=1;}
}
}
}
}
for(int y=1;y<=n;y++) {
if(vis[y]==1)
cnt++;
}
if(cnt==n)
System.out.println("yes");
else
System.out.println("no");
}
System.exit(0);
}
}