顺丰笔试AC
第一题求连通团数。
const int maxn = 100005;
int n,m,k;
int a[maxn], b[maxn], vis[maxn];
vector<int> vc[maxn],vs[maxn];
set <int> an[maxn];
int ans;
void dfs(int u){
vis[u] = 1;
int le = vc[u].size();
for(int i = 0;i<le;i++){
int z = vc[u][i];
an[ans].insert(z);
int len = vs[z].size();
for(int j = 0;j<len;j++){
int v = vs[z][j];
if(vis[v] == 0){
dfs(v);
}
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i = 0;i<k;i++){
int x,y;
cin>>x>>y;
vc[x].push_back(y);
vs[y].push_back(x);
}
ans = 0;
for(int i =1;i<=n;i++){
if(vis[i] == 0){
dfs(i);
ans++;
}
}
int cont = 0;
for(int i = 0;i<ans;i++){
if(an[i].size() == 0){
cont++;
}
}
if(cont == ans) ans++;
cout<<ans-1<<endl;
return 0;
} 第二题最长伪递增子序列裸题
查看16道真题和解析