日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

题解 T28305 【yizimi的旅游景点】

發布時間:2024/4/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 题解 T28305 【yizimi的旅游景点】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接這里!!!

AC軍團月賽題目地址這里!!!正比例函數的旅游景點

題目翻譯

我依然不會告訴你題目的難度有一半是讀題

其實就是給定一個圖中一部分點,給定一部分邊,先讓你求這之中的最小生成樹,然后再這個樹的基礎上求關于所有點和所有邊的最大生成樹。

好用的最小生成樹模板

看到這里我覺得大部分dalao就可以喊著“這出題人語文真差而且這道題真水”去寫代碼秒題了

如果您還往下看,只有兩種可能:

1.yizimi的語文太菜了,題目翻譯還是看不懂2.不會寫代碼誒

好,基本上就沒別的彎路,上代碼:

#include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> using namespace std; #define go(i, j, n, k) for (int i = j; i <= n; i += k) #define fo(i, j, n, k) for (int i = j; i >= n; i -= k) #define rep(i, x) for (int i = h[x]; i; i = e[i].nxt) #define mn 20020 #define mm 200010 #define inf 1 << 30 #define ll long long #define ld long double #define fi first #define se second #define root 1, n, 1 #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 #define bson l, r, rt inline int read() {int f = 1, x = 0;char ch = getchar();while (ch > '9' || ch < '0'){if (ch == '-')f = -f;ch = getchar();}while (ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f; } inline void write(int x) {if (x < 0)putchar('-'), x = -x;if (x > 9)write(x / 10);putchar(x % 10 + '0'); } //This is AC head above... int n, m; int ans, tot, cnt; bool b[mn]; struct edge {int u, v, w, p;bool used; } e[mm]; inline bool cmp1(edge a, edge b) {return a.w < b.w; } inline bool cmp2(edge a, edge b) {return a.w > b.w; } int father[mn]; inline int findx(int x) {return father[x] == x ? x : father[x] = findx(father[x]); } inline void mergex(int x, int y)//隨機合并大法好 {int xx = findx(x);int yy = findx(y);if (xx == yy)return;srand((unsigned)time(NULL));//隨機合并if (rand() % 2){father[xx] = yy;}else{father[yy] = xx;} } inline void Krus()//最小生成樹 {go(i, 1, n, 1)father[i] = i;sort(e + 1, e + m + 1, cmp1);go(i, 1, m, 1){if (b[e[i].u] && b[e[i].v] && findx(e[i].u) != findx(e[i].v) && e[i].p == 1 && !e[i].used){ans += e[i].w;mergex(e[i].u, e[i].v);e[i].used = true;cnt++;}if (cnt == tot - 1)return;} } inline void Krub()//最大生成樹 {sort(e + 1, e + m + 1, cmp2);go(i, 1, m, 1){if (findx(e[i].u) != findx(e[i].v) && !e[i].used){ans += e[i].w;mergex(e[i].u, e[i].v);e[i].used = true;cnt++;}if (cnt == n - 1)return;} } int main() {//freopen("002.in", "r", stdin);//freopen("002.out", "w", stdout);n = read(), m = read();go(i, 1, n, 1){b[i] = read();//cin >> b[i];//scanf("%d", &b[i]);if (b[i])tot++;}go(i, 1, m, 1){e[i].u = read(), e[i].v = read(), e[i].w = read(), e[i].p = read(), e[i].w *= e[i].p, e[i].used = false;//cin >> e[i].u >> e[i].v >> e[i].w >> e[i].p;//scanf("%d%d%d%d", &e[i].u, &e[i].v, &e[i].w, &e[i].p);//e[i].w *= e[i].p, e[i].used = false;}//這里你可以試試cin,保證慢死Krus();if (cnt != tot - 1){cout << -1;return 0;}int ans1 = ans;Krub();if (cnt != n - 1){cout << -1;return 0;}cout << ans1 << " " << ans - ans1;return 0; }

有些大佬看到這里可能會說:

明明我寫對了,為什么會T?

我只是想說:

dalao您先看看時限!

這個題是300ms,如果你用cin大約是600ms(部分點),不開O2都有可能T掉。

這就是這個題的最大的坑

讀入優化大法好

轉載于:https://www.cnblogs.com/yizimi/p/10056230.html

總結

以上是生活随笔為你收集整理的题解 T28305 【yizimi的旅游景点】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。