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


posted @ 2016-10-16 19:56  see_you_later  阅读(113)  评论(0编辑  收藏  举报