NYOJ 題目42 一筆畫問題(歐拉圖)
阿新 • • 發佈:2017-05-22
light ear ims ++ ring 推斷 post else tar
一筆畫問題
時間限制:3000 ms | 內存限制:65535 KB 難度:4- 描寫敘述
-
zyc從小就比較喜歡玩一些小遊戲。當中就包含畫一筆畫。他想請你幫他寫一個程序。推斷一個圖是否可以用一筆畫下來。
規定,全部的邊都僅僅能畫一次,不能反復畫。
- 輸入
- 第一行僅僅有一個正整數N(N<=10)表示測試數據的組數。
每組測試數據的第一行有兩個正整數P,Q(P<=1000,Q<=2000)。分別表示這個畫中有多少個頂點和多少條連線。(點的編號從1到P)
隨後的Q行。每行有兩個正整數A,B(0<A,B<P),表示編號為A和B的兩點之間有連線。 - 輸出
- 假設存在符合條件的連線。則輸出"Yes",
假設不存在符合條件的連線。輸出"No"。 - 例子輸入
-
2 4 3 1 2 1 3 1 4 4 5 1 2 2 3 1 3 1 4 3 4
- 例子輸出
-
No Yes
- 來源
- [張雲聰]原創
- 上傳者
- 張雲聰
ac代碼
#include<stdio.h> #include<string.h> int head[1010]; struct s { int u,v,next; }edge[2020*2]; int n,m,cnt,vis[1010],dig[1010],sum; void add(int u,int v) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } void dfs(int u) { vis[u]=1; sum++; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!vis[v]) dfs(v); } } int main() { int t; scanf("%d",&t); while(t--) { //int n,m; scanf("%d%d",&n,&m); int i,cnt=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(dig,0,sizeof(dig)); for(i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); dig[u]++; dig[v]++; add(u,v); add(v,u); } sum=0; dfs(1); if(sum<n) { printf("No\n"); continue; } int ans=0; for(i=1;i<=n;i++) { if(dig[i]&1) ans++; } if(ans==2||ans==0) { printf("Yes\n"); } else printf("No\n"); } }
NYOJ 題目42 一筆畫問題(歐拉圖)