您的位置:首页 > 其它

lightoj 1003 强联通模板题

2013-11-10 21:34 204 查看
#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
=1;
for(int i=0;i<G
.size();i++)
{
int v=G
[i];
if(!used[v])
dfs(v);
}
topo.push_back(n);
}

void rdfs(int n,int k)
{
used
=1;
for(int i=0;i<rG
.size();i++)
{
int v=rG
[i];
if(!used[v])
rdfs(v,k);
}
cmp
=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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: