uoj 117 尤拉迴路

2021-09-12 22:05:12 字數 2773 閱讀 5212

1.判斷是否為尤拉存在尤拉迴路---裸的判斷

尤拉迴路就是看一筆能不能把途中所有的邊跑完沒得重複

對於無向邊----建立雙向邊判斷每個點的入度是否為2的倍數   

1.1

對於有向邊---建立單向邊判斷每個點的入度與出度是否相等   

1.2

然後就是看一下是否所有的點是否連線----可以用並查集或者dfs判斷,具體看情況來定。2

判斷是否存在尤拉迴路,就是同時滿足上邊的1,2兩個條件

hdu 1878** 並查集 條件1.1+2

#include#include#include#include#include#include#include#include#include#include#define myself i,l,r

#define lson i<<1

#define rson i<<1|1

#define lson i<<1,l,mid

#define rson i<<1|1,mid+1,r

#define half (l+r)/2

#define inff 0x3f3f3f3f

#define lowbit(x) x&(-x)

#define me(a,b) memset(a,b,sizeof(a))

#define min4(a,b,c,d) min(min(a,b),min(c,d))

#define min3(x,y,z) min(min(x,y),min(y,z))

#define max4(a,b,c,d) max(max(a,b),max(c,d))

#define max3(x,y,z) max(max(x,y),max(y,z))

typedef long long ll;

using namespace std;

const int maxn=1005;

int f[maxn],vis[maxn];

int n,m;

void init()

}int find(int x)

void unionn(int x,int y)

int main()

bool flag=true;

int cnt=0;

for(int i=1;i<=n;i++)

if(cnt>1)

flag=false;

else

}if(flag)

printf("1\n");

else

printf("0\n");

}return 0;

}

2。輸出尤拉迴路 uoj 117

分兩種情況建立單向或者雙向邊

判斷1.1 or 1.2 ,然後用dfs來進行遍歷,如果能夠遍歷所有的邊,那麼輸出即可

但是這道題的資料很大很坑,存在的問題就是可能會出現自環,比如給了10000組的 1 1邊,那麼dfs的時候遍歷是會超時的,利用鄰接表的性質進行優化

**如下

#include#include#include#include#include#include#include#include#include#include#define myself i,l,r

#define lson i<<1

#define rson i<<1|1

#define lson i<<1,l,mid

#define rson i<<1|1,mid+1,r

#define half (l+r)/2

#define inff 0x3f3f3f3f

#define lowbit(x) x&(-x)

#define me(a,b) memset(a,b,sizeof(a))

#define min4(a,b,c,d) min(min(a,b),min(c,d))

#define min3(x,y,z) min(min(x,y),min(y,z))

#define max4(a,b,c,d) max(max(a,b),max(c,d))

#define max3(x,y,z) max(max(x,y),max(y,z))

typedef long long ll;

const double pi=acos(-1.0);

const double e=2.718281828459;

using namespace std;

const int maxn=1e5+5;

const int maxm=2e5+5;

struct node

edge[maxm<<1];

int n,m;

int in[maxn],out[maxn];

int head[maxn],sign,cnt;

void add(int u,int v)

; head[u]=sign;

}void init()

int ans[maxm];

void dfs_unedge(int u)

}void dfs_diredge(int u)

}}int main()

else

}if(t==1)//條件1.1

else//條件1.2

if(t==1) dfs_unedge(x);//

else dfs_diredge(x);

if(cnt!=m)//條件2

printf("no\n");

else

return 0;

}

UOJ 117 尤拉迴路

分析 直接dfs一遍,複雜度o n m 注意類似dinic的當前弧優化,雙向邊標記兩條。sigongzi和mrclr的部落格,關於尤拉迴路以及此題文章。有關尤拉路的總結。1 2 author mjt 3 date 2018 10 16 17 34 46 4 last modified by mjt ...

UOJ 117 尤拉迴路

在圖中找乙個環使得每條邊都在環上出現恰好一次。要注意的地方好多啊 每條邊恰好出現一次!條件 每個點偶度 入度 出度 方法就是套圈法啦 然後本題自環是合法的,如果20000個 1,1 邊的話會被卡成 o n 2 所以加上當前弧優化 include include include include inc...

尤拉迴路 UOJ117 尤拉迴路 題解

判斷無向圖和有向圖是不是尤拉迴路。如果是,求出任意一條尤拉迴路。判斷尤拉迴路 證明?我不會啊!怎麼求尤拉迴路呢?因為已經確定了是尤拉迴路,所以我們可以直接dfs瞎搞。隨便從乙個點開始dfs,一條邊走過後就刪除。回溯時將其入隊。最後的佇列反過來就是答案。原理 最後的佇列是返回路徑,所以反過來就是答案。...