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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ1466 最大点权独立集

發布時間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ1466 最大点权独立集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:
? ? ? 給你n個人,再給你每個人都喜歡哪些人,讓你找到一個最大的集合數,要求這個集合里面任意兩個人都不喜歡彼此。


思路:
? ? ? 直接就是在問最大點權獨立集元素個數,沒啥解釋的一遍二分圖就行了,輸出 n - sum / 2,說下為什么有的最大點權獨立集合除以2有的不除吧,這個沒什么固定的,比如說這個題給的邊一定是雙向的,也就是說 1 喜歡 2, 到2的時候也會喜歡1 所以就多出來一倍,要除以二,不是什么最大點權獨立集元素個數就是等于n - sum / 2,比如題目給的是單項的關系,就不用了,說這個的原因是記得以前學二分圖的時候在網上看到有人說最大點權獨立集元素個數是 n - sum / 2。只要理解了就不會22的記住了。說多了。。。


#include<stdio.h> #include<string.h>#define N_node 500 + 50 #define N_edge 250000 + 50typedef struct {int to ,next; }STAR;STAR E[N_edge]; int list[N_node] ,tot; int mk_dfs[N_node] ,mk_gx[N_node];void add(int a ,int b) {E[++tot].to = b;E[tot].next = list[a];list[a] = tot; }int DFS_XYL(int x) {for(int k = list[x] ;k ;k = E[k].next){int to = E[k].to;if(mk_dfs[to]) continue;mk_dfs[to] = 1;if(mk_gx[to] == -1 || DFS_XYL(mk_gx[to])){mk_gx[to] = x;return 1;}}return 0; }int main () {int n ,a ,b ,i ,nn;while(~scanf("%d" ,&n)){memset(list ,0 ,sizeof(list));tot = 1;for(i = 1 ;i <= n ;i ++){scanf("%d: (%d) " ,&a ,&nn);for(int j = 1 ;j <= nn ;j ++){scanf("%d" ,&b);add(a+ 1 ,b + 1);}}int sum = 0;memset(mk_gx ,255 ,sizeof(mk_gx));for(i = 1 ;i <= n ;i ++){memset(mk_dfs ,0 ,sizeof(mk_dfs));sum += DFS_XYL(i);}printf("%d\n" ,n - sum / 2);}return 0; }

總結

以上是生活随笔為你收集整理的POJ1466 最大点权独立集的全部內容,希望文章能夠幫你解決所遇到的問題。

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