NBUT 1554 Lord of Minecraft

比赛的时候数据错了、、好坑爹、越想越复杂、、、→_→

其实就是一次BFS求出层次图、然后判断、、、

#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
#define LL long long int
int n,m;
const int N=10005;
int k;
struct node
{
    int to,next,val;
}edge[N];
int head[N];
int level[N];
void init()
{
    k=0;
    memset(head,-1,sizeof(head));
}
void add(int x,int y,int val)
{
    edge[k].to=y;
    edge[k].val=val;
    edge[k].next=head[x];
    head[x]=k++;
}
void bfs(int start)
{
    queue<int>q;
    level[1]=1;
    q.push(1);
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int s=edge[i].to;
            level[s]=level[now]+1;
            q.push(s);
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
    map<string,int>M;
    M["Hungar"]=1;
    char str1[15];
    char str2[15];
    int cnt=2;
    init();
    for(int i=1;i<=n;i++)
    {
        scanf("%s%s",str1,str2);
        if(M[str1]==0)M[str1]=cnt++;
        if(M[str2]==0)M[str2]=cnt++;
        add(M[str2],M[str1],1);
    }
    bfs(1);
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        scanf("%s%s",str1,str2);
        if(level[M[str1]]<=level[M[str2]])ans++;
    }
    printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(层次图)