本题要求输出两个顶点之间是否存在路径
输入格式:
输入包括两部分,第一部分是邻接矩阵表示方法中对应1的两个顶点,用0 0 表示结束
第二部分是两个顶点,例如 Vi和Vj
输出格式:
如果Vi和Vj存在路径,输出1;否则输出0
输入样例:
0 1
1 0
0 4
4 0
1 4
4 1
1 2
2 1
1 3
3 1
2 3
3 2
4 5
5 4
4 6
6 4
0 0
0 5
输出样例:
1
解题思路:本题思路主要是将这些输入数据存入邻接表(自己实现)里,然后通过比较此路径是否在广度优先序列内即可。理论成立,代码如下:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s="";
mychart s1=new mychart();
int c=0,d=0;
Nodemember t=null;
while(!(s=sc.nextLine()).equals("0 0"))
{
c=s.charAt(0)-'0';
d=s.charAt(2)-'0';
//直接头插法
t=new Nodemember(d);
t.next=s1.a[c].nextone;
s1.a[c].nextone=t;
}
String s2=sc.nextLine();
c=s2.charAt(0)-'0';
d=s2.charAt(2)-'0';
boolean x=s1.contains(s1, c, d);
System.out.println(x==true?1:0);
}
}
class mychart
{
int visit[];//访问数组
Nodehead a[];//头节点数组
mychart()
{
visit=new int[100];
a=new Nodehead[100];
for(int i=0;i<100;i++)
a[i]=new Nodehead();
}
public boolean contains(mychart s1,int v,int b)//灵感来源于数据结构书,邻接表的广度优先遍历。
{
Nodemember t;
int w;
Queue<Integer> qu =new LinkedList<Integer>();
qu.offer(v);
if(v==b)
return true;
visit[v]=1;
while(!qu.isEmpty())
{
v=qu.poll();
t=s1.a[v].nextone;
while(t!=null)
{
w=t.data;
if(visit[w]==0)
{
if(w==b)
return true;
visit[w]=1;
qu.offer(w);
}
t=t.next;
}
}
return false;
}
}
class Nodehead//头节点类
{
char b;
Nodemember nextone;
Nodehead()
{
nextone=null;
}
}
class Nodemember//成员节点类
{
int data;
Nodemember next;
Nodemember(int b)
{
this.data=b;
this.next=null;
}
}
(由于我做这个题的时候只有一个测试点所以输出1或者0试一试就知道了,以后测试点个数会不会变动就不知道了。)