題目:空間里有n個點,任意三點不共線。每兩個點之間都用紅色或者黑色線段鏈接。如果
一個三角形的三條邊同色,則這個三角形是單色三角形。對於給定的紅色線段列表,
找出單色三角形的個數。
分析:由於三角形總數C(n,3),所以求出異色三角形個數就求出了同色三角形個數。用暴力
枚舉的方法,我們將遍歷所有的三角形,時間復雜度為O(n^3),則必定超時。而經過推敲,我們會
發現這樣的對應關系,一個異色三角形存在兩個頂點,在該三角形中與它們相鄰的兩邊是不同色
的;而對從一個頂點出發的兩條異色邊都屬於一個異色三角形。這是個一對二的關系。設第i個點
連接了ai條紅邊、n-1-ai條黑邊,這些邊一定屬於ai(n-1-ai)個不同的異色三角形。由於異色三角形
都會被考慮兩次,所以最終的答案為ans/2。這個思想只需要從第一個頂點遍歷到最后一個頂點,
所以時間復雜度是O(n)。
1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 const int maxn = 10000; 6 int n, m, T; 7 long long ans; 8 vector<int>s[maxn]; 9 int main() 10 { 11 ios::sync_with_stdio(false); 12 cin >> T; 13 while (T--) 14 { 15 s->clear(); 16 cin >> n >> m; 17 for (int i = 1; i <= m; i++) 18 { 19 int a, b; 20 cin >> a >> b; 21 s[a].push_back(b); 22 s[b].push_back(a); 23 } 24 for (int i = 1; i <= n; i++) 25 ans += (n - 1 - s[i].size())*s[i].size(); 26 ans /= 2; 27 cout << (n*(n - 1)*(n - 2)) / 6 - ans << endl; 28 } 29 return 0; 30 }