刚学OI三天的蒟蒻求助/kk

CF19E Fairy

重新贴个代码: ```cpp #include <queue> #include <cstdio> using namespace std; #define debug puts("qaq") struct edge{ int v,last,yuanlai; }edge[20005],tree[20005]; int n,m; int cnt; int ecnt; int tcnt; int d[10005]; int p[10005]; int pt[10005]; int iu[10005];//i号边u节点 int iv[10005];//i号边v节点 bool vis[10005]; int color[10005]; int depth[10005]; int f[10005][25]; bool is_on_tree[20005];//i号边是否在树上 priority_queue<int,vector<int>,greater<int> > pq; inline void init(){ for (int i=1;i<=n;i++){ p[i]=pt[i]=color[i]=depth[i]=-1; } } inline void add(int u,int v){ edge[++ecnt].v=v; edge[ecnt].last=p[u]; p[u]=ecnt; } inline void addt(int u,int v,int yl){ tree[++tcnt].v=v; tree[tcnt].last=pt[u]; tree[tcnt].yuanlai=yl; pt[u]=tcnt; } void dfs(int u,int nc){//染色,建树 color[u]=nc; for (int i=p[u];i!=-1;i=edge[i].last){ int v=edge[i].v; if (color[v]==-1){ dfs(v,1-nc); is_on_tree[i]=true; if (u<v) is_on_tree[i+1]=true; else is_on_tree[i-1]=true; addt(u,v,(i+1)/2);addt(v,u,(i+1)/2); } } } void dfs2(int u,int fa){//为LCA做准备 f[u][0]=fa;depth[u]=depth[fa]+1; for (int j=1;j<=18;j++){ f[u][j]=f[f[u][j-1]][j-1]; } for (int i=pt[u];i!=-1;i=tree[i].last){ int v=tree[i].v; if (v!=fa){ dfs2(v,u); // printf("%d->%d\n",u,v); } } } inline int lca(int u,int v){ if (depth[u]<depth[v]){ int t=u;u=v;v=t; } int j=18; while(j>=0){ if (depth[f[u][j]]>=depth[v]){ u=f[u][j]; } --j; } if (u==v){ return u; } for (j=18;j>=0;j--){ if (f[u][j]!=f[v][j]){ u=f[u][j];v=f[v][j]; } } return f[u][0]; } bool dfs3(int u,int fa){//计算差分 vis[u]=true; for (int i=pt[u];i!=-1;i=tree[i].last){ int v=tree[i].v; if (v!=fa){ // printf("%d->%d:%d\n",u,v,res+d[u]); bool qwq=dfs3(v,u); d[u]+=d[v]; if (qwq){ pq.push(tree[i].yuanlai); } } } // printf("d[%d]=%d\n",u,d[u]); return d[u]==cnt; } int main(){ scanf("%d%d",&n,&m); init(); for (int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); if (u>v){ int t=u;u=v;v=t; } iu[i]=u;iv[i]=v; add(u,v);add(v,u); } for (int i=1;i<=n;i++){//染色 if (color[i]==-1){ dfs(i,0); } } /* for (int i=1;i<=n;i++){ printf("color[%d]=%d\n",i,color[i]); } //*/ for (int i=1;i<=n;i++){//准备 if (depth[i]==-1){ dfs2(i,0); } } // debug; for (int i=1;i<=m;i++){ if (!is_on_tree[2*i]){ if (color[iu[i]]==color[iv[i]]){ if (!cnt) pq.push(i);//对于只有一个奇环的情况,非树边也OK ++cnt; int nu=iu[i]; int nv=iv[i]; if (depth[nu]<depth[nv]){ int t=nu;nu=nv;nv=t; } int L_C_A=lca(nu,nv); if (L_C_A==nv){ d[nu]++;d[nv]--; } else{ d[nu]++;d[nv]++; d[L_C_A]--; } } } } /* for (int i=1;i<=n;i++){ printf("d[%d]=%d\n",i,d[i]); } printf("%d\n",cnt); //*/ if (!cnt){ printf("%d\n",m); for (int i=1;i<=m;i++){ printf("%d ",i); } } else{ if (cnt!=1) pq.pop(); for (int i=1;i<=n;i++){//计算差分 if (!vis[i]){ dfs3(i,0); } } printf("%d\n",pq.size()); while(!pq.empty()){ printf("%d ",pq.top()); pq.pop(); } } return 0; } ```
by muyang_233 @ 2021-08-14 11:17:06


虽然考虑了连通性,但感觉问题还是出在连通性上/youl
by muyang_233 @ 2021-08-14 11:17:49


|