人类正在经历一场生化危机,许多城市已经被病毒侵袭,这些城市中的人们为了避免感染病毒,计划开车逃往其他没有被病毒入侵的城市(安全城市)。有些城市之间有公路直达,有些没有。虽然他们知道哪些城市是安全的,但是不知道有没有一条安全路径能够到达安全城市(只有该路径上经过的所有城市都是安全的,该路径才是安全路径)。请你编写一个程序帮助他们判断。
输入格式:
输入第一行为三个正整数,分别表示所有城市个数m(m<=100)、安全城市个数n(m<=50)、公路个数k(k<=100)。随后一行给出n个安全城市的编号。随后k行,每一行给出两个整数,表示连接一条公路的两个城市编号。最后一行输入两个整数,分别表示当前所在城市s、目标城市d。每行整数之间都用空格分隔。
输出格式:
若目标城市已被病毒入侵(非安全城市),输出"The City i is not safe!";若目标城市为安全城市且从当前所在城市能够经过一条安全路径到达目标城市,输出"The city can arrive safely!";若目标城市为安全城市但是从当前所在城市没有一条安全路径到达目标城市,输出"The city can not arrive safely!",i为目标城市编号。
输入样例1:
5 2 5
3 4
0 1
0 2
0 4
1 2
2 4
0 4
输出样例1:
The city 4 can arrive safely!
输入样例2:
5 2 5
3 4
0 1
0 2
0 4
1 2
2 4
0 3
输出样例2:
The city 3 can not arrive safely!
输入样例3:
5 2 5
3 4
0 1
0 2
0 4
1 2
2 4
0 1
输出样例3:
The city 1 is not safe!
思路:
本来一开始想这题觉得挺难的,需要用到图的深搜来遍历每一条路,最后来找一条安全的路到达目标城市,但是写完过完样例提交后,答案错误了。然后重新看了一遍题目,发现这题的思路因该是很简单的,直接用邻接矩阵存下城市就可以了,最后直接查询目标城市和目前所在的城市之间是否有通路就行了。
代码:
#include <stdio.h>
#define MAXN 100
typedef struct
{
int arcs
[MAXN
][MAXN
];
int vexnum
,arcnum
;
}AMGraph
;
int main()
{
int n
;
AMGraph G
;
scanf("%d %d %d",&G
.vexnum
, &n
, &G
.arcnum
);
int safecity
[MAXN
];
for(int i
=0;i
<n
;i
++)
{
scanf("%d",&safecity
[i
]);
}
for(int i
=0;i
<G
.vexnum
;i
++)
{
for(int j
=0;j
<G
.vexnum
;j
++)
{
G
.arcs
[i
][j
]=0;
}
}
for(int i
=0;i
<G
.arcnum
;i
++)
{
int x
,y
;
scanf("%d %d",&x
,&y
);
G
.arcs
[x
][y
]=1;
G
.arcs
[y
][x
]=1;
}
int now
,destination
,flag
=0;
scanf("%d %d",&now
,&destination
);
for(int i
=0;i
<n
;i
++)
{
if(destination
==safecity
[i
])
{
flag
=1;
break;
}
}
if(G
.arcs
[now
][destination
]==1)
{
if(flag
)
printf("The city %d can arrive safely!\n",destination
);
else
{
printf("The city %d is not safe!\n",destination
);
}
}
else
{
if(flag
)
printf("The city %d can not arrive safely!\n",destination
);
else printf("The city %d is not safe!\n",destination
);
}
return 0;
}