#include<stdio.h>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
#include<iostream>
#include<string.h>
using namespace std;
map<string,int> mp;
vector<int> topo;
vector<int> G[12000];
vector<int> rG[12000];
int cmp[20000];
int num_kind=0;
int used[20000];
void dfs(int n)
{
used[n]=1;
for(int i=0;i<G[n].size();i++)
{
int v=G[n][i];
if(!used[v])
dfs(v);
}
topo.push_back(n);
}
void rdfs(int n,int k)
{
used[n]=1;
for(int i=0;i<rG[n].size();i++)
{
int v=rG[n][i];
if(!used[v])
rdfs(v,k);
}
cmp[n]=k;
}
int scc()
{
memset(used,0,sizeof(used));
topo.clear();
for(int i=0;i<num_kind;i++)
{
if(!used[i])
dfs(i);
}
memset(used,0,sizeof(used));
int k=0;
for(int i=num_kind-1;i>=0;i--)
{
int v=topo[i];
if(!used[v])
rdfs(v,k++);
}
return k;
}
int main()
{
int cas;
scanf("%d",&cas);
for(int T=1;T<=cas;T++)
{
num_kind=0;
memset(G,0,sizeof(G));
memset(rG,0,sizeof(rG));
mp.clear();
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
string from,to;
cin>>from>>to;
if(mp.find(from)==mp.end())
{
mp[from]=num_kind++;
}
if(mp.find(to)==mp.end())
{
mp[to]=num_kind++;
}
if(mp[from]!=mp[to])
{
G[mp[from]].push_back(mp[to]);
rG[mp[to]].push_back(mp[from]);
}
}
int k=scc();
if(k==num_kind)
printf("Case %d: Yes\n",T);
else
printf("Case %d: No\n",T);
}
}
lightoj 1003 强联通模板题
最新推荐文章于 2016-09-23 13:04:30 发布