日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACM题目————一笔画问题

發布時間:2023/12/13 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM题目————一笔画问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

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

?

?可以用并查集做,也可以直接建圖做。

?

因為正在加班加點的學習數據結構,于是先建圖做了一次。

參考了http://www.cnblogs.com/dongsheng/archive/2012/06/04/2534489.html

建圖:

//Asimple#include <stdio.h> #include <iostream> #include <algorithm>using namespace std;const int maxn = 1005; int n, T, num, cnt, point, line, x, y; int G[maxn][maxn]; int vis[maxn];//標記數組,標記是否走過 int p[maxn];//每個節點的度//圖的DFS //歐拉圖:節點度數全部為偶數 //半歐拉圖:有且只有兩個度數為奇數的節點 //這兩種圖都可以一筆畫出。void DFS(int i) {int v;vis[i] = 1 ;for(v=0; v<point; v++)if( v!=i && G[i][v] && !vis[v])DFS(v); }int main() {cin >> T ;while( T -- ){cnt = 0 ;bool flag = true ;cin >> point >> line ;memset(p,0,sizeof(p));memset(vis,0,sizeof(vis));memset(G,0,sizeof(G));for(int i=0; i<line; i++){cin >> x >> y ;G[x-1][y-1] = G[y-1][x-1] = 1 ;//建圖++ p[x-1] ;++ p[y-1] ;//統計 各節點的度}DFS(0);//判斷是否連通for(int i=0; i<point; i++){G[i][i] = 1 ;if( vis[i]==0 ) flag = false ;if( p[i]&1 ) cnt ++ ;}if( flag )//是連通圖{if( cnt==0 || cnt==2 ) cout << "Yes" << endl ;else cout << "No" << endl ;}else cout << "No" << endl ;}return 0; }

?并查集:

#include <cstdio> #include <iostream> #include <cstring>using namespace std;int father[1005], deg[1005];int find(int k) {if(k == father[k])return k;elsereturn father[k] = find(father[k]); }int main() {int T, p, q, a, b;scanf("%d", &T);while(T--){scanf("%d%d", &p, &q);for(int i = 1; i <= p; ++i){father[i] = i;deg[i] = 0;}while(q--){scanf("%d%d", &a, &b);++deg[a];++deg[b];int fa = find(a);int fb = find(b);if(fa != fb)father[fa] = fb;}int cnt1, cnt2;cnt1 = cnt2 = 0;for(int i = 1; i <= p; ++i){if(father[i] == i){++cnt1;if(cnt1 > 1)break;}if(deg[i] & 1)++cnt2;}if(cnt1 > 1)printf("No\n");else{if(cnt2 == 0 || cnt2 == 2)printf("Yes\n");elseprintf("No\n");}}return 0; }

?

轉載于:https://www.cnblogs.com/Asimple/p/5532803.html

總結

以上是生活随笔為你收集整理的ACM题目————一笔画问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。