Light Oj 1003

题意 : 给你m个二元关系, 问是否可以确定各个节点的先后关系;

思路: 拓扑排序, 判断是否有环;

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 131;
struct Node{
    int nxt, to;
}edge[maxn];
int Head[maxn], tot;

void AddEdge(int From, int To)
{
    edge[tot].to = To;
    edge[tot].nxt = Head[From];
    Head[From] = tot++;
}

map<string, int> StoI;
string a, b;
int Vis[maxn];/// 记录节点的访问次数

void TopSort(int n)
{
    queue<int> qu;
    int lest = n;
    for(int i = 1; i <= n; ++i)
    {
        if(!Vis[i]) qu.push(i);
    }
    while(!qu.empty())
    {
        int u = qu.front();
        qu.pop();
        --lest;
        for(int i = Head[u]; i != -1; i = edge[i].nxt)
        {
            int v = edge[i].to;
            --Vis[v];
            if(!Vis[v]) qu.push(v);
        }
    }
    if(lest) puts("No");
    else puts("Yes");
}

int main()
{
    int t;
    scanf("%d",&t);
    for(int kase = 1; kase <= t; ++kase)
    {
        int m;
        scanf("%d",&m);
        StoI.clear();
        memset(Head,-1,sizeof(Head));
        tot = 0;
        int n = 0;
        memset(Vis, 0, sizeof(Vis));
        for(int i = 1; i <= m; ++i)
        {
            cin >> a >> b;
            if(StoI.find(a) == StoI.end())
                StoI[a] = ++n;
            if(StoI.find(b) == StoI.end())
                StoI[b] = ++n;
            ++Vis[StoI[b]];
            AddEdge(StoI[a], StoI[b]);
        }
        printf("Case %d: ",kase);
        TopSort(n);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值