ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020 ECNU Campus Online Invitational Contest

2021-07-03 11:00:39  阅读:206  来源: 互联网

标签:Invitational Contest int top head ECNU 回路 next 欧拉


E. Even Degree

Problem - E - Codeforces

 

找出欧拉图的欧拉回路,并将路径都存入数组中,计第一位l=1最后一位r=top(top为改欧拉图的边数)

找欧拉回路的操作:

  从任意一点开始dfs,dfs的途中删除已经遍历过的边减小搜索规模,具体操作每次便利前向星的时候不让i直接等于e[i].next而是修改head[u]为e[i].next然后再让他等于head[u]

for(int i=head[u];i;i=head[u]){
     head[u]=e[i].next;
}

找出欧拉回路后先从l到r遍历如果碰到边的两端的度都为奇数,就从取当前最后一条边直到当前图只剩一条边的时候结束

void work(){
    int l=1,r=top;
    while(l<r){
        int id=st[l];
        int u=E[id].u,v=E[id].v;
        if(deg[u]&1&&deg[v]&1){
            id=st[r];
            u=E[id].u,v=E[id].v;
            r--;
        }
        else  l++;
        deg[u]--;
        deg[v]--;
        as.push_back(id);

    }
}

 

全部代码如下:

#include<bits/stdc++.h>
using namespace std;

const int inf=0x3f3f3f3f;
const int N=5e5+10;
inline int rd(){
    int x;
    scanf("%d",&x);
    return x;
}
vector<int>as;
int head[N],vis[N],cnt=1,top=0,st[N],deg[N];
struct edge{
    int v,next,id;
}e[N<<1];
struct EDGE{
    int u,v;
}E[N<<1];
inline void addedge(int u,int v,int id){
    e[cnt]={v,head[u],id};
    head[u]=cnt++;
}
void dfs(int u){
    for(int i=head[u];i;i=head[u]){
        int id=e[i].id,v=e[i].v;
        head[u]=e[i].next;
        if(vis[id])continue;
        vis[id]=1;
        dfs(v);
        st[++top]=id;
    }
}
void work(){
    int l=1,r=top;
    while(l<r){
        int id=st[l];
        int u=E[id].u,v=E[id].v;
        if(deg[u]&1&&deg[v]&1){
            id=st[r];
            u=E[id].u,v=E[id].v;
            r--;
        }
        else  l++;
        deg[u]--;
        deg[v]--;
        as.push_back(id);

    }
}
int main(){
    int n=rd(),m=rd();
    for(int i=1;i<=m;i++){
        int u=rd(),v=rd();
        E[i]=EDGE{u,v};
        addedge(u,v,i);
        addedge(v,u,i);
        deg[u]++;
        deg[v]++;
    }
    int ans=m;
    for(int i=1;i<=n;i++){
        top=0;
        dfs(1);
        if(top)work(),ans--;
    }
    printf("%d\n",ans);
    for(int i=0;i<as.size();i++){
        printf("%d ",as[i]);
    }
    puts("");
}

 

标签:Invitational,Contest,int,top,head,ECNU,回路,next,欧拉
来源: https://www.cnblogs.com/tatakai/p/14965806.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有