题目链接:租用游艇
AC代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define up(i, h, n) for (int i = h; i <= n; i++)
#define down(i, h, n) for(int i = h; i >= n; i--)
#define wh(x) while(x--)
#define node struct node
#define it ::iterator
#define Ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
constexpr int N = 500005;
constexpr int mod = 1e9 + 7;
int f[205][205];
int main() {
Ios;
int n;
cin >> n;
up(i, 1, n) {
up(j, 1, n) f[i][j] = mod;
}
up(i, 1, n) {
up(j, i + 1, n) {
cin >> f[i][j] ;
}
}
up(k, 1, n) {
up(i, 1, n) {
up(j, 1, n) {
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
cout << f[1][n];
return 0;
}
题目链接:最小生成树
题解:简单的最小生成树模版。
AC代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define up(i, h, n) for (int i = h; i <= n; i++)
#define down(i, h, n) for(int i = h; i >= n; i--)
#define wh(x) while(x--)
#define node struct node
#define it ::iterator
#define Ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
constexpr int N = 500005;
constexpr int mod = 1e9 + 7;
node{
int x,y,z;// 起点、终点和边长
};
node a[N];
int f[50005];
int sum, num;
int find(int x) { // 并查集查找
return f[x] == x ? x : f[x] = find(f[x]);
}
int cmp(node a, node b) {
return a.z < b.z;
}
int main() {
Ios;
int n, m;
cin >> n >> m;
up(j, 1, m) {
cin >>a[j].x >> a[j].y >> a[j].z;
}
up(i, 1, n) f[i] = i;
sort(a + 1, a + m + 1, cmp);// 按边长从小到大排序
up(i, 1, m) {
if (find(a[i].x) != find(a[i].y)) {
f[find(a[i].y)] = find(a[i].x); // 合并
sum += a[i].z;
num++;
if (num == n - 1) {
break;
}
}
}
if (num == n - 1) cout << sum;
else cout << "orz";
return 0;
}
题目链接:拆地毯
题解:也是最小生成树模版,注意结束条件即可。
AC代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define up(i, h, n) for (int i = h; i <= n; i++)
#define down(i, h, n) for(int i = h; i >= n; i--)
#define wh(x) while(x--)
#define node struct node
#define it ::iterator
#define Ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
constexpr int N = 500005;
constexpr int mod = 1e9 + 7;
node{
int u,v,w;
};
node a[N];
int f[N];
int n, m, k;
int find(int x) {
return f[x] == x ? x : f[x] = find(f[x]);
}
int cmp(node a, node b) {
return a.w > b.w;
}
int main() {
Ios;
cin >> n >> m >> k;
up(i, 1, m) {
cin >> a[i].u >> a[i].v >> a[i].w;
}
up(i, 1, n) {
f[i] = i;
}
sort(a + 1, a + m + 1, cmp);
int ans = 0,sum=0;
up(i, 1, m) {
if (find(a[i].u) != find(a[i].v)) {
f[find(a[i].v)] = find(a[i].u);
sum++;
ans += a[i].w;
}
if (sum >= k) break;
}
cout << ans;
return 0;
}