這是一道枚舉例題,題目大意是汹碱,有 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 四個數(shù)字跪腹,顯然超時褂删。
我們可以枚舉 abc,然后再枚舉d冲茸,同時驗證abd和acd屯阀,這樣時間復(fù)雜度就是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;
}