Consortium
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submissions: 6325 Accepted: 2184
Description
Windy has a country, and he wants to build an army to protect his country. he has picked up N girls and M boys and wants to collect them to be his soldiers. to collect a soldier without any privilege, he must pay 10000 RMB. there are some relationships between girls and boys and Windy can use these relationships to reduce his cost. if girl x and boy y have a relationship d and one of them has been collected, Windy can collect the other one with login -D RMB. now given all the relationships between girls and boys, your assignment is to find the least amount of money Windy has to pay. notice that only one relationship can be used when collecting one soldier.
Input
The first line of input is the number of test case.
The first line of each test case contains three integers, N, M and R.
Then R lines followed, each contains three integers xi, yi and di.
There is a blank line before each test case.
1 ≤ N, M ≤ 10000
0 ≤ R ≤50,000
0 ≤ xi <N
0 ≤ yi <M
0 <di <10000
Output
For each test case output the answer in a single line.
Sample Input
2
5 5 8
4 3 6831
1 3 4583
0 0 6592
0 1 3063
3 3 4975
1 3 2049
4 2 2104
2 2 781
5 5 10
2 4 9820
3 2 6236
3 1 8864
2 4 8326
2 0 5156
2 0 1463
4 1 2439
0 4 4373
3 4 8889
2 4 3133
Sample Output
71071
54223
Question: Conscription: There are n girls and m boys, each of which costs 10000 yuan. However, boys and girls interact with each other to reduce costs. For example, if the number of girls is 1 and the number of boys is 1, then after the recruitment of Girls, Boys only need to enter the army after the recruitment.
This question is very mysterious. It is actually the minimal spanning tree. At the beginning, I also treated boys and girls separately, that is, every time I get the minimum greedy value, I would use the relationship between boys and girls and the relationship between girls and boys to get the minimum value, and then I would take it again. Use prime. This can be done, but the number of boys and girls is large and the memory is too large.
As a matter of fact, boys and girls are the same type of points in the figure, but only boys and girls can communicate. Therefore, use krusical to add the minimum value each time. Same as the minimal spanning tree
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int n,m;struct node{ int x,y,s;}e[50010];int f[20010];int find(int x){ return (f[x]==x? x:f[x]=find(f[x]));}bool cmp(node s, node v){ return s.s>v.s;}void krusical(int p){ int i,j,ans=0; for (i=0; i<p; i++) { int x=find(e[i].x); int y=find(e[i].y); if (x!=y) { ans+=e[i].s; f[x]=f[y]; } } cout<<10000*(n+m)-ans<<endl;}int main (){ int i,j,t,r,s; cin>>t; while(t--) { int p=0; cin>>n>>m; for (i=0; i<=n+m; i++) f[i]=i; cin>>r; while(r--) { scanf("%d%d%d",&e[p].x,&j,&e[p].s); e[p++].y=j+n; } sort(e,e+p,cmp); krusical(p); } return 0;}