歐拉回路+無極卡常——51nod1967 路徑定向

題面:51nod1967
辣雞出題人卡邊表差評。。。
卡常數卡啊卡交了35發才過QAQ

當然底下還有,反正佔了兩頁


本題的主題思路就是求一個歐拉回路,我們把有向圖暫時先看作無向圖
首先第一問其實就是度爲偶數點的個數
第二問我們把其他度爲奇數的點兩兩連起來,然後整張圖跑歐拉回路定向就好了啊
沒有卡常的能看的代碼(加了I/O優化):

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <ctime>
#include <map>
#include <queue>
#include <cstdlib>
#include <string>
#include <climits>
#include <set>
#include <vector>
using namespace std;
inline int read(){
    int k=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
    return k*f;
}
int n,m,f[600001],d[600001],K[600001];
int nedge=0,p[600001],c[1000001],nex[600001],head[600001],e[600001];
inline void addedge(int x,int y,int z,int zz){
    p[++nedge]=y;c[nedge]=z;nex[nedge]=head[x];head[x]=nedge;e[nedge]=zz;
}
inline void dfs(int x){
    for(int k=head[x];k;k=nex[k])if(f[c[k]]==-1){
        f[c[k]]=e[k];dfs(p[k]);
    }
}
int main()
{
    n=read();m=read();
    memset(f,-1,sizeof f);
    for(int i=1;i<=m;++i){
        int x,y;x=read();y=read();
        addedge(x,y,i,0);addedge(y,x,i,1);
        ++d[x];++d[y];
    }
    int M=m;
    for(int i=1;i<=n;++i)if(d[i]&1)K[++K[0]]=i;
    for(int i=1;i<=K[0];i+=2){
        m++;addedge(K[i],K[i+1],m,0);addedge(K[i+1],K[i],m,1);
    }
    printf("%d\n",n-K[0]);
    for(int i=1;i<=n;++i)dfs(i);
    for(int i=1;i<=M;++i)printf("%d",f[i]);
    return 0;
}

然後愉快地TLE了
整個卡常過程分爲以下幾步:
1. 把所有i++改成了++i(然並卵
2. 聽了szb的建議把頭文件給刪了(這個時候我旁邊的zcydalao用vector輕鬆AC本題
3. 瘋狂地改數組大小+I/O優化
4. 然後總算找到一個合理的數組範圍卡過了。。。

卡常過的不能看的代碼:

#include <stdio.h>
using namespace std;
inline int read(){
    int k=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}
    return k*f;
}
inline void write(int x){if(x>=10)write(x/10);putchar(x%10+'0');} 
inline void writeln(int x){write(x);puts("");}
bool e[730001];char f[400001];
int n,m,d[100001],K[400001]={0},cnt=-1;
int nedge=0,p[730001],c[730001],nex[730001],head[730001];
inline void addedge(int x,int y,int z){
    ++cnt;p[++nedge]=y;c[nedge]=z;nex[nedge]=head[x];head[x]=nedge;e[nedge]=cnt&1;
}
inline void dfs(int x){
    for(int k=head[x];k;k=nex[k])if(f[c[k]]==-1){
        f[c[k]]=e[k];dfs(p[k]);
    }
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n+m;++i)f[i]=-1;
    for(int i=1;i<=m;++i){
        int x,y;x=read();y=read();
        addedge(x,y,i);addedge(y,x,i);
        ++d[x];++d[y];
    }
    int M=m;
    for(int i=1;i<=n;++i)if(d[i]&1)K[++K[0]]=i;
    for(int i=1;i<=K[0];i+=2){
        addedge(K[i],K[i+1],++m);addedge(K[i+1],K[i],m);
    }
    writeln(n-K[0]);
    for(int i=1;i<=n;++i)dfs(i);
    for(int i=1;i<=M;++i)write(f[i]);
    return 0;
}

最慢一個點1156ms(卡過。。。),vector好像600ms就直接A掉了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章