题目大意:给你一张有向图,问你是否可以进行拓扑排序;
题目解析:开一个队列,每一次删除入度为0的点,并把相应的边删掉,更新队列中入度为0的元素,当队列为空的时候,看是否为num个,是的话就是DAG了;
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<vector>
using namespace std;
map<string,int>ma;
vector<int>vec[10010];
int in[10010],num;
bool toposort()
{
int flag=0,i;
queue<int>q;
for(i=1;i<=num-1;i++)
{
if(in[i]==0)
q.push(i);
}
while(!q.empty())
{
int temp=q.front();
q.pop();
flag++;
for(i=0;i<vec[temp].size();i++)
{
in[vec[temp][i]]--;
if(in[vec[temp][i]]==0)
q.push(vec[temp][i]);
}
}
if(flag==num-1)
return true;
else
return false;
}
int main()
{
int cas,i,c,n;
string a,b;
cin>>cas;
for(c=1;c<=cas;c++)
{
for(i=0;i<=10010;i++)
vec[i].clear();
ma.clear();
memset(in,0,sizeof(in));
cin>>n;
num=1;
for(i=1;i<=n;i++)
{
cin>>a>>b;
if(!ma[a])
ma[a]=num++;
if(!ma[b])
ma[b]=num++;
in[ma[b]]++;
vec[ma[a]].push_back(ma[b]);
}
if(toposort())
printf("Case %d: Yes\n",c);
else
printf("Case %d: No\n",c);
}
return 0;
}