顺丰笔试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; }第二题最长伪递增子序列裸题