反正就是也不懂:
Universal Online Judge:#81. 一般图最大权匹配:
从前一个和谐的班级,所有人都是搞OI的。有 n 个是男生,有 0 个是女生。男生编号分别为 1,…,n。
现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人负责吐槽。每个人至多属于一个小组。
有若干个这样的条件:第 v 个男生和第 u 个男生愿意组成小组,并能写出 w 万万行的代码。
请问这个班级里的动态仙人掌的总代码量最多是多少?
输入格式
第一行两个正整数,n,m。保证 n≥2。
接下来 mm 行,每行三个整数 v,u,w 表示第 v 个男生和第 u 个男生愿意组成小组,且能写出 w 万万行的代码。保证 1≤v,u≤n,保证v≠u,保证同一对 v,u 不会出现两次(这里是无序对)。
输出格式
第一行一个整数,表示总代码量最多是多少(单位是万万行)。
接下来一行 n 个整数,描述一组最优方案。第 v 个整数表示 v 号男生所在小组的另一个男生的编号。如果 v 号男生没有小组请输出 0。
样例一
input
7 20
5 7 9
3 7 4
3 6 6
2 5 8
5 1 9
1 3 6
6 5 1
2 7 4
2 3 5
6 4 2
7 1 5
5 4 4
4 1 3
5 3 9
7 6 4
2 1 3
4 3 9
6 2 7
4 2 8
6 1 10
output
28
6 0 4 3 7 1 5
限制与约定
1≤n≤400,1≤m≤798001≤w≤5×108。
时间限制:2s
空间限制:256MB
不要求最大匹配,要求是匹配,且最大权
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#define ll long long
#define llu unsigned ll
using namespace std;
const int maxn=620; //内存开点数的1.5倍
const int inf=0x3f3f3f3f;
struct node
{
int x,y,z;
node(){
}
node(int a,int b,int c)
{
x=a,y=b,z=c;
}
}g[maxn][maxn];
int n,m,nx,t,lab[maxn],match[maxn],slack[maxn];
int st[maxn],pa[maxn],flower_from[maxn][maxn],S[maxn],vis[maxn];
vector<int>flower[maxn];
deque<int>q;
int dist(node e)
{
return lab[e.x]+lab[e.y]-g[e.x][e.y].z*2;
}
void update_slack(int x,int y)
{
if(!slack[y]||dist(g[x][y])<dist(g[slack[y]][y]))
slack[y]=x;
}
void set_slack(int y)
{
slack[y]=0;
for(int x=1;x<=n;x++)
if(g[x][y].z>0&&st[x]!=y&&S[st[x]]==0)
update_slack(x,y);
}
void q_push(int x)
{
if(x<=n) return q.push_back(x);
for(int i=0;i<flower[x].size();i++) q_push(flower[x][i]);
}
void set_st(int x,int b)
{
st[x]=b;
if(x<=n) return;
for(int i=0;i<flower[x].size();i++) set_st(flower[x][i],b);
}
int get_pr(int b,int xr)
{
int pr=find(flower[b].begin(),flower[b].end(),xr)-flower[b].begin();
if(pr%2==1)
{
reverse(flower[b]