这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
2020-2021:teams:namespace:牛客多校第三场 [2020/07/20 09:47] great_designer [A] |
2020-2021:teams:namespace:牛客多校第三场 [2020/07/23 21:28] (当前版本) great_designer [A] |
||
---|---|---|---|
行 466: | 行 466: | ||
</hidden> | </hidden> | ||
- | =====A===== | + | =====G===== |
+ | |||
+ | 以下是补题。 | ||
<hidden> | <hidden> | ||
- | <code C> | + | <code C++> |
- | </code> | + | #include<stdio.h> |
- | </hidden> | + | #include<stdlib.h> |
+ | #include<vector> | ||
- | =====A===== | + | using namespace std; |
- | <hidden> | + | struct head |
- | <code C> | + | { |
+ | struct head *r; | ||
+ | int val; | ||
+ | }; | ||
+ | |||
+ | int dsu[1000000]; | ||
+ | |||
+ | int get(int v) | ||
+ | { | ||
+ | if (v == dsu[v]) return v; | ||
+ | else return dsu[v] = get(dsu[v]); | ||
+ | } | ||
+ | |||
+ | pair<struct head*, struct head*> g[1000000]; | ||
+ | |||
+ | pair<struct head *, struct head *> merge(pair <struct head *, struct head *> a, pair <struct head *, struct head *> b) | ||
+ | { | ||
+ | if (!a.second) return b; | ||
+ | else | ||
+ | { | ||
+ | a.second->r = b.first; | ||
+ | return make_pair(a.first, b.second); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | pair <struct head*, struct head*> lst(int x) | ||
+ | { | ||
+ | struct head *t =(struct head*)malloc(sizeof(struct head)); | ||
+ | t->r=0; | ||
+ | t->val=x; | ||
+ | return make_pair(t,t); | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int t; | ||
+ | scanf("%d",&t); | ||
+ | while(t--) | ||
+ | { | ||
+ | int n,m; | ||
+ | scanf("%d%d",&n,&m); | ||
+ | int i; | ||
+ | for(i = 0; i < n; i++) | ||
+ | { | ||
+ | dsu[i] = i; | ||
+ | g[i] =make_pair((struct head*)0,(struct head*)0); | ||
+ | } | ||
+ | for(i = 0; i < m; i++) | ||
+ | { | ||
+ | int x, y; | ||
+ | scanf("%d%d",&x,&y); | ||
+ | g[x] = merge(g[x], lst(y)); | ||
+ | g[y] = merge(g[y], lst(x)); | ||
+ | } | ||
+ | int q; | ||
+ | scanf("%d",&q); | ||
+ | for(i = 0; i < q; i++) | ||
+ | { | ||
+ | int c; | ||
+ | scanf("%d",&c); | ||
+ | if (get(c) != c) | ||
+ | { | ||
+ | continue; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | vector<int> ord; | ||
+ | struct head *s; | ||
+ | for(s = g[c].first; s != 0; s = s->r) | ||
+ | { | ||
+ | int z = s->val; | ||
+ | if (get(z) != c) | ||
+ | { | ||
+ | int who = get(z); | ||
+ | dsu[who] = c; | ||
+ | ord.push_back(who); | ||
+ | } | ||
+ | } | ||
+ | g[c] =make_pair((struct head*)0,(struct head*)0); | ||
+ | vector<int>::iterator p; | ||
+ | for(p=ord.begin();p!=ord.end();p++) | ||
+ | { | ||
+ | g[c] = merge(g[c],g[(*p)]); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | for(i = 0; i < n; i++) | ||
+ | { | ||
+ | printf("%d ",get(i)); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | } | ||
+ | } | ||
</code> | </code> | ||
</hidden> | </hidden> | ||
+ | |||
+ | |||