[bzoj3624][apio2008]免費道路
試題描述
輸入
輸出
輸入示例
572輸出示例1304
5132
0531
4301
2142
1
320資料規模及約定4305
3112
1
見「輸入」。
題解
第一步,先盡量加入 c = 1 的邊,若未形成乙個連通塊,則得到必須加入的 c = 0 的邊。
第二步,加入那些必須加入的 c = 0 的邊,盡量加入 c = 0 的邊直到這種邊數量達到 k,再加入 c = 1 的邊直到形成一棵樹。
最後判一判 no solution 的情況。
#include #include #include #include #include #include #include #include #include #include #include using namespace std;const int buffersize = 1 << 16;
char buffer[buffersize], *head, *tail;
inline char getchar()
return *head++;
}int read()
while(isdigit(c))
return x * f;
}#define maxn 20010
#define maxm 100010
int n, m, k;
struct edge
} es[maxm];
int fa[maxn];
void init()
int findset(int x)
int main()
for(int i = 1; i <= m; i++) if(!es[i].c)
int cnt = 0;
init();
for(int i = 1; i <= m; i++) if(es[i].has) fa[findset(es[i].v)] = findset(es[i].u), cnt++;
for(int i = 1; i <= m && cnt < k; i++) if(!es[i].c)
for(int i = 1; i <= m; i++) if(es[i].c)
if(cnt != k) puts("no solution");
else for(int i = 1; i <= m; i++) if(es[i].has) printf("%d %d %d\n", es[i].u, es[i].v, es[i].c);
return 0;
}
bzoj 3624 Apio2008 免費道路
這題一看,不是一句話題意,不想做。題意就不說了吧。首先想到的肯定是最小生成樹。然後我就想起了以前的某道題。好吧,記不大清了。我一開始的想法是貪心替換。就是先把圖構好,然後用0去換1 也就是先把全部1跑一次,然後把0跑一次,先把必要的0拿出來,然後再在剩下的0裡面選替代1的。然後隨手給自己的替代方法舉...
BZOJ3624 APIO2008 免費道路
並查集 題目傳送門 題目要求的就是恰好包含 k 條鵝卵石路的生成樹。首先我們用水泥邊建出生成樹森林,然後再用鵝卵石邊把森林連成一棵樹。如果需要用到的鵝卵石邊大於 k 則無解。如果無法連成一棵樹則無解。連成一棵樹之後也許此時用到的鵝卵石邊比 k 要小,我們暫且稱已經用到的鵝卵石邊為必要邊。我們把樹全部...
bzoj3624 Apio2008 免費道路
失蹤人口回歸。題目大意 求圖一棵生成樹,使得這棵樹里恰好有 k 條特殊邊。兩遍 kruskal 第一遍優先加入非特殊邊,預處理出有哪些邊是非選不可的。第二遍先加入 k 條特殊邊,再加入非特殊邊。判斷 no solution 時細節較多,詳見 includeusing namespace std de...