您的位置:首页 > 其它

xuput_sta15

2016-04-10 20:10 204 查看



1189: 爱游戏的招财猫

时间限制: 1 Sec 内存限制: 64 MB

提交: 35 解决: 3

[提交][状态][讨论版]


题目描述

招财猫正在玩一个游戏,他向他的所有联系人发一条短信“这里是来自xxx的问候。”,收到这条短信的人会将其原封不动地转发给自己通讯录里的所有人。

如果招财猫最后也收到自己这条短信,那么招财猫会很开心

现在给你N个人和他们各自的通讯录都有谁,问如果编号为i的人玩这个游戏,他最后会收到源自自己的短信么?(1<=i<=N)

通讯录是单向的。(招财猫的通讯录里有你,但你的通讯录里不一定有招财猫)


输入

第一行给定两个整数N,M,表示N个人,M种关系( N<=1000)

接下来M行, 每行两个整数a和b,表示a的通讯录里有b。1<=a,b<=N。(保证a!=b)


输出

一共N行,每行一个字符T或F 。第 i 行表示编号为i的人是否收到了源自自己发出的短信 ,如果收到了,就输出T,反之输出F。


样例输入

3 3
1 2
2 3
3 1


样例输出

T
T
T



分析:有向图,使用深搜判断是否成圈。

code:
#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;
typedef long long ll;
int flag[1005];
int vis[1005][1005];
int maze[1005][1005];
int N,M;

void dfs(int s,int to,int goal)
{
if(s==goal)
{
flag[goal]=1;
return ;
}

int t=0;
for(t=1;t<=N;t++)
{
if(maze[s][t]==1)
if(vis[s][t]==0)
{
vis[s][t]=1;
dfs(t,0,goal);
vis[s][t]=0;
}
}
}

int main(void)
{
cin>>N>>M;
memset(flag,0,sizeof flag);

for(int i=0;i<M;i++)
{
ll a,b;
cin>>a>>b;
maze[a][b]=1;
}

for(int i=1;i<=N;i++)
for(int a=1;a<=N;a++)
{
if( maze[i][a]==1 ) dfs(a,0,i);
}

for(int i=1;i<=N;i++)
{
if(flag[i]) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: