您的位置:首页 > 其它

哈理工OJ 1708 许可证【临街表+dfs】

2016-02-05 14:29 225 查看
许可证
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 297(79 users)Total Accepted: 102(67 users)Rating:





Special Judge: No
Description
mac最近开了一家麻辣面馆,但是开面馆也不是件容易的事情,为了让广大客户相信自己面馆的权威性,mac想尽可能的获得多的许可证,但是发证的单位也不是随便就给发证的,通常情况下,发证的单位要看看店内是否有其它的相关证明,如果有才给发证。例如:mac要想获得美食局的证那么他就必须先获得卫生局的证件。现在mac手里只有一个房产证,我们将其编号为1,mac想知道他最多可以获得多少证件。

Input
多组测试数据。

对于每组测试数据,第一行输入两个整数n,m(0<n, m<=100),分别表示证件的种数(编号1~n),和已知的不同证件之间的约束的关系数。

接下来的m行,每行两个正数a,b(1<=a,b<=n)表示如果mac有证件a,就可以获得证件b。

Output
对于每组测试数据,输出一个整数表示mac最多可以获得的证件的种类数(包括一开始就有的1号证件)。

Sample Input
4 3

1 2

2 3

3 4

Sample Output
4

这个题刚上来看题是真的想的到很多方向去做。首先看到了全序关系,首先想到的是有向图,然后就顺气自然的想到了拓扑排序,也是特喵的样例比较6,正好举出的栗子是全图并且无环,这特喵的误导我,直接拓扑走了一发,然后怒WA,重新读了一遍题之后才明白,直接用邻接表找关系就行了,何必这么麻烦。而且题目没有保证所有点都出现,所以用拓扑是不对的。(而且更没有保证是无向图)

然后就用临街表走了一发,实力RE,然后就明白应该是有自环的可能,加上了几个小小的细节,最终AC~

这里说一下思路:

因为我们有证件1,所以先把能通过证件1直接能搞到的证件直接枚举出来,然后进入下一次查找,把这些能够直接搞到的证件,像刚才一样枚举他们能够直接找到的证件,也就是能通过证件1,间接搞到的证件,然后一步一步走下去 ,统计起来就能AC了~(数据比较小).

一发dfs搞定、

这里上AC代码:

#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
vector<int>a[1005];
int vis[1005];
void dfs(int x)
{
    if(vis[x]==1)
    return ;
    vis[x]=1;
    for(int k=0;k<a[x].size();k++)
    {
        int u=a[x][k];
        dfs(u);
    }
    return ;
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
        {
            a[i].clear();
        }
        memset(vis,0,sizeof(vis));
        while(m--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
        }
        dfs(1);
        int output=0;
        for(int i=1;i<=n;i++)
        {
            if(vis[i])
            output++;
        }
        printf("%d\n",output);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: