问题 H: ch追妹
题目描述
n个点的一张无向图,ch站在a点,ch要追的妹子站在b点。r_clover为了让ch安心训练,要阻止ch追妹。ch每走一步,r_clover就会挖断一条路。ch和r_clover均采用最优策略,问ch能不能追到妹子
输入
第一行为数据组数T(T≤10)。
每组数据的第一行为四个数 n,m,a,b(1≤a,b≤n≤20; 1≤m≤80),分别表示点数,边数,ch的位置,妹子的位置。
之后m行,每行两个数 u,v(1≤u,v≤n),表示u,v之间有一条无向边。数据保证没有重边和自环(即不会出现u到u的边,也不会出现两条u到v的边)。
输出
对每组数据输出一行,如果ch能够成功追妹,输出chhappy,否则输出chsad。
样例输入
22 1 1 21 23 2 1 31 22 3
样例输出
chhappychsad
解题思路:
这题刚开始想了很久,最开始想会不会是第k短路问题,因为涉及到最优策略。之后又想了想最小割,涉及到切断路径。都没什么思路,最后开始思考什么样的图能使ch追妹成功,当ch位置和妹子位置相邻时肯定是成功的。当ch位置和妹子位置的最短路径为2时,这是ch前进一步,从距离为2的点到达距离为1的点,因为图中没有重边,所以距离为1的点和妹子位置只有一条边!!这时只需要切断这条边即可!! 所以当ch与妹子距离为2时是不可能成功的。。。以此类推。。。只有距离为1时才能成功
代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m,a,b;
cin>>n>>m>>a>>b;
int flag=0;
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
if(v==a&&u==b||v==b&&u==a) flag=1;
}
if(flag)
cout<<"chhappy"<<endl;
else
cout<<"chsad"<<endl;
}
}