正则表达式最小生成树算法题
正则表达式可以校验字符串是否满足一定的规则,并且来校验数据格式的合法性
正则表达式中的规则:
“|”这个符号也表示或者
用()来分组
“\\”组号,“\\1”表示把第1组的内容再拿出来用一次
后续还需要继续使用本组的数据。
正则内部使用:\\组号
正则外部使用:$组号
贪婪爬取ab+尽可能多的获取数据
非贪婪爬取ab+?
非捕获分组:
分组之后不需要再用本组数据,仅仅是把数据括起来。
(?:正则) 获取所有 不占用组号
(?=正则)获取前面部分
(?!正则)获取不是指定内容的前面部分
示例:
一个账号为十位开头非零的正则
[1-9][0-9]{9}
密码必须包含:至少8位,大小写字母、数字、特殊字符
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$
判断邮箱格式
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$
最小生成树算法水题:
这是一个简单的最小生成树,只要将最后的结果进行判定即可
#include<iostream>
#include<algorithm>
using namespace std;
int n, m, k;
int total = 0,ans=0;
int f[10000];
struct node {
int x, y, edge;
}a[100000];
bool cmp(node a, node b) {
return a.edge < b.edge;
}
int find(int x) {
if (x == f[x])return x;
return f[x] = find(f[x]);
}
int main() {
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
f[i] = i;
}
for (int i = 1; i <= m; i++) {
cin >> a[i].x >> a[i].y >> a[i].edge;
}
sort(a + 1, a + 1 + m, cmp);
if (n < k) {
cout << "No Answer";
return 0;
}
else {
for (int i = 1; i <= m; i++) {
int u = find(f[a[i].x]);
int v = find(f[a[i].y]);
if (f[u] ==v)continue;
f[u] = v;
total++;
ans += a[i].edge;
if (total == n -k)break;
}
cout << ans;
}
return 0;
}