xuput_sta15

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;
    }
}


你可能感兴趣的:(xuput_sta15)