Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52299 | Cidoai | 子网 | C++ | 解答错误 | 20 | 19 MS | 3412 KB | 1329 | 2022-07-19 11:51:55 |
#include<cstdio> #include<queue> using namespace std; typedef long long ll; int n,m; int k[4405],c[4405][42]; int net[4405]; int used[8005],vis[8005],ans; struct node{ int num,pos; friend bool operator <(node x,node y){ return x.num>y.num; } }; priority_queue<node> q[8005],g; int main(){ // freopen("subnet.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ scanf("%d",k+i); for(int j=1;j<=k[i];++j){ scanf("%d",&c[i][j]); q[c[i][j]].push(node{k[i],i}); vis[c[i][j]]++; } } for(int i=1;i<=n;++i) g.push(node{vis[i],i}); while(!g.empty()){ node h=g.top(); int u=h.pos; g.pop(); if(vis[u]!=h.num||vis[u]==0||used[u]) continue; while(!q[u].empty()){ if(net[q[u].top().pos]) q[u].pop(); else{ int tp=q[u].top().pos; int chs=0,bts=4401; for(int i=1;i<=k[tp];++i){ if(!used[c[tp][i]]&&c[tp][i]!=u){ if(vis[c[tp][i]]<bts){ bts=vis[c[tp][i]]; chs=i; } } } if(chs){ used[c[tp][chs]]=1; used[u]=1; ans++; net[tp]=1; for(int j=1;j<=k[tp];++j){ if(!used[c[tp][j]]){ vis[c[tp][j]]--; g.push(node{vis[c[tp][j]],c[tp][j]}); } } break; } q[u].pop(); } } } printf("%d\n",ans); return 0; }