小团的旅行线路
题目:
小团是一个旅游爱好者,快要过春节了,他想统计一下,在过去的一年中他进行过几次旅行,于是他打开了美团app的订单记录,记录显示了他的购买车票的记录。记录是按时间顺序给出的,已知一次旅行的线路一定是一个闭环,即起点和终点是同一个地点。因此当每找到一段闭合的行程,即认为完成了一次旅行。数据保证不会出现不在闭环路径中的数据。
请你在小团的购票记录中统计出他全年共进行了多少次旅行?
输出描述: 输出仅包含一个整数,表示小团的旅行次数。
输入例子
1: 6
beijing nanjing
nanjing guangzhou
guangzhou shanghai
shanghai beijing
fuzhou beijing
beijing fuzhou输出例子
1:
2
这道题的思路在于使用并查集,由于题目直接告知不存在不在闭环路径中的数据。所以我们只需要考虑在并查集进行连接的时候判断是否能够连接成功即可,不成功的话证明出现了环,答案加一。
下面是代码。
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int num=scanner.nextInt();
//对城市进行编号
Map<String, Integer> map=new HashMap<>();
int index=0;
int ans=0;
List<int[]> list=new ArrayList<>();
//这一段是为了将城市转换为对应的编号进行连接
for (int i=0;i<num;i++)
{
int x=index;
String a=scanner.next();
if (!map.containsKey(a))
{
map.put(a,index++);
}
else
{
x=map.get(a);
}
int y=index;
String b=scanner.next();
if (!map.containsKey(a))
{
map.put(a,index++);
}
else
{
y=map.get(b);
}
list.add(new int[]{x,y});
}
unionSet set=new unionSet(map.size());
for (int i=0;i<list.size();i++)
{
int[] nums=list.get(i);
//连接不成功答案++
if (!set.union(nums[0],nums[1]))
{
ans++;
}
}
System.out.println(ans);
}
public static class unionSet{
int[] p;
public unionSet(int l) {
this.p = new int[l];
for (int i=0;i<l;i++)
{
p[i]=i;
}
}
public int find(int x)
{
if (p[x]==x)
{
return p[x];
}
return find(p[x]);
}
public boolean union(int x,int y)
{
int X=find(x);
int Y=find(y);
if (X==Y)
{
return false;
}
p[Y]=x;
return true;
}
}