輸入 n,m
給 3*n個人的能力值,和m 對 關係,
有關係的人必須組成一隊,,(一隊只能3人)
2 1
1 2 3 4 5 6
3 4
整理後的結果是
單人的 1 2 5 6 兩人一組的是 (3,4) 要想組成一隊,就是 1,2,5 (3,4,6) 這是一種組法
組成隊伍後的能力值是最小的那個人的能力值,所有隊伍能力值最大是多少?
#includeusing namespace std;
typedef long long ll;
ll dp[3100][3100];
int f[3003];
ll dui[3003];
int sum[3003];
ll v[3003];
vectorq1;
vectorq2;
vectorq3;
bool flag=0;
int findd(int a)
void marge(int a,int b)
// else
//
}}int main()
for(int i=0;i>a>>b;
marge(a-1,b-1);
}if(flag==1)
//void union(int x,int y)
//}//int main()
//// for (int i=1;i<=m;i++)
// for (int i=1;i<=n*3;i++)
// sort(a,a+ta);
// sort(b,b+tb);
//// memset(dp,-1,sizeof dp);
// dp[0][0]=0;
// for (int i=0;i// for (int j=0;j// if (dp[i][j]!=-1)
// if (dp[ta][tb]==-1)
// printf("-1\n");
// else
// printf("%lld\n",ans+dp[ta][tb]);
////}
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...
經商 並查集 簡單dp
傳送門 先用並查集將其集合化,然後尋找與1乙個集合的所有人。因為每個人只可以使用一次,所以在dp的迴圈中,把人數的迴圈放在外面。include using namespace std const int mx 1e4 9 int t,n,m,c,fa mx u,v,k,t mx ans struct...
並查集和帶權並查集
並查集是乙個很高效演算法,理解起來也很簡單,寫起來更簡單。fat i i 找到乙個點的祖先 int findfat int x 二中的方法肯定不好,因為如果資料比較極端,那麼並查集就退化成乙個鏈了 如果加入了路徑壓縮,並查集這個演算法就更高效了。int findfat int x 遞迴寫法 int ...