zoukankan      html  css  js  c++  java
  • Lightoj1003【判环操作】

    题意:

    对于n个给出字符串a,b,理解成a在b之前办好这个事情,要求n个给出两个串,a都要在b之前完成;

    题意:

    所以一旦出现环就不行了;

    以前在写最短路的时候,spfa就有一个判环,后来写着写着写到了拓扑排序。。。。。判环就好了;

    #include<cstdio>
    #include<queue>
    #include<map>
    #include<string>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int INF=0x3f3f3f3f;
    const LL mod=1e9+7;
     
    const int N=2e4+10;
    struct asd{
        int to;
        int next;
    };
    asd q[N];
    int tol,head[N],num;
    int pre[N];
     
    bool spfa()
    {
        int k;
        int sum=0;
        for(int i=1;i<=num;i++)
        {
            k=-1;
            for(int j=1;j<=num;j++)
            {
                if(!pre[j])
                {
                    k=j;
                    sum++;
                    pre[j]=-1;
                    break;
                }
            }
            if(k==-1)
            {
                if(sum==num)
                    return true;
                return false;
            }
            for(int v=head[k];v!=-1;v=q[v].next)
            {
                int i=q[v].to;
                if(pre[i]>0)
                    pre[i]--;
            }
        }
    }
     
    void add(int a,int b)
    {
        q[tol].to=b;
        q[tol].next=head[a];
        head[a]=tol++;
    }
     
    map<string,int>mp;
    int Getid(char *s)
    {
        if(mp.find(s)!=mp.end())
            return mp[s];
        return mp[s]=++num;
    }
     
    void init()
    {
        num=0;
        memset(pre,0,sizeof(pre));
        mp.clear();
        memset(head,-1,sizeof(head));
        tol=0;
    }
     
    int main()
    {
        int T,cas=1;
        int x,y;
        char s1[15],s2[15];
        scanf("%d",&T);
        while(T--)
        {
            int m;
            scanf("%d",&m);
            init();
            while(m--)
            {
                scanf("%s%s",s1,s2);
                x=Getid(s1);
                y=Getid(s2);
                add(x,y);
                pre[y]++;
            }
            printf("Case %d: ",cas++);
            if(spfa())
                puts("Yes");
            else
                puts("No");
        }
        return 0;
    }


  • 相关阅读:
    从通胀说起
    科技见欲迷人眼
    吃货在西安 之 粉丝羊血泡馍
    祝母亲大人福如东海长流水,寿比南山不老松
    久违的蓝调北京
    调和生活前的问题
    《N2CMS实例教程》第四讲:Article Template Page
    《N2CMS实例教程》前言
    《N2CMS实例教程》第一讲:开发环境
    Microsoft Sync Framework 学习实例1文件同步
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6216792.html
Copyright © 2011-2022 走看看