日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 5486 Difference of Clustering 图论

發布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 5486 Difference of Clustering 图论 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=5486

題意:

給你每個元素一開始所屬的集合和最后所屬的集合,問有多少次集合的分離操作,并操作和不變操作。

分離:[m1,m2,m3]->[m1],[m2],[m3]

合并:分離的逆操作

不變:[m1,m2,m3]->[m1,m2,m3]

題解;

以集合為單位建圖,(一個元素從集合s1到s2則建一條邊連接集合s1,s2,注意要刪除重邊)

然后對于每個點,與它相鄰的點如果入度都為1,則為分離操作,

把圖轉置,再跑一遍分離就是合并。

如果一個集合只有一條連向自己的邊,那么說明它是1:1操作。

代碼:

#include<iostream> #include<cstdio> #include<map> #include<vector> #include<algorithm> #include<cstring> using namespace std;const int maxn = 1e6 + 10;int n,_max; map<pair<int, int>, int> mp; vector<int> G[maxn], G2[maxn]; int in[maxn], in2[maxn];void init() {_max = -1;mp.clear();for (int i = 0; i <maxn; i++) G[i].clear(),G2[i].clear();memset(in, 0, sizeof(in));memset(in2, 0, sizeof(in2)); }int main() {int tc,kase=0;scanf("%d", &tc);while (tc--) {scanf("%d", &n);init();for (int i = 0; i < n; i++) {int u, v;_max = max(_max, u);_max = max(_max, v);scanf("%d%d", &u, &v);if (!mp[make_pair(u, v)]) {mp[make_pair(u, v)]++;G[u].push_back(v);in[v]++;G2[v].push_back(u);in2[u]++;}}int ans1=0, ans2=0,ans3=0;for (int i = 0; i <= _max; i++) {int su = 1;for (int j = 0; j < G[i].size(); j++) {int v = G[i][j];if (in[v] > 1) { su = 0; break; }}if (su) {if (G[i].size() == 1) ans3++;else if(G[i].size()>1) ans2++;}}for (int i = 0; i <= _max; i++) {int su = 1;for (int j = 0; j < G2[i].size(); j++) {int v = G2[i][j];if (in2[v] > 1) { su = 0; break; }}if (su) {if (G2[i].size() == 1);else if(G2[i].size()>1) ans1++;}}printf("Case #%d: %d %d %d\n", ++kase, ans2,ans1, ans3);}return 0; }

轉載于:https://www.cnblogs.com/fenice/p/5602152.html

總結

以上是生活随笔為你收集整理的HDU 5486 Difference of Clustering 图论的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。