这是一道枚举例题,题目大意是,有 m 个三元组两两不同,如果选出四个三元组 (a,b,c),(a,b,d),(a,c,d),(b,c,d),可以满足1≤a<b<c<d≤n,请问有多少种这样的可能性?
n 最大 2000,如果直接枚举 a,b,c,d 四个数字,显然超时。
我们可以枚举 abc,然后再枚举d,同时验证abd和acd,这样时间复杂度就是O(mn)了。
#include <iostream>
#include <set>
#include <vector>
#include <tuple>
using namespace std;
set<tuple<int,int,int>> data;
vector<int> two[2001][2001];
int main() {
int n, m, ans = 0;
cin >> n >> m;
for (int i = 1 ; i <= m ; i++) {
int u , v , w;
cin >> u >> v >> w;
two[u][v].push_back(w);
data.insert({u,v,w});
}
for (auto x : data) {
int u, v, w;
tie(u,v,w) = x;
for (int j = 0 ; j < two[v][w].size() ; j++) {
int z = two[v][w].at(j);
if(data.count({u,w,z}) && data.count({u,v,z})) {
ans++;
}
}
}
cout << ans << endl;
return 0;
}
网友评论