組合數學 單色三角形,,(排列組合+容斥原理)


  題目:空間里有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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM