日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

hdu3018 一笔画问题

發布時間:2025/6/17 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3018 一笔画问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一幅畫,這幅畫由點和邊構成,問你最少幾筆能把這幅畫畫完。


思路:
? ? ?這個題目的結論比較巧妙,首先我們考慮下,如果給的圖是歐拉圖,或者是條歐拉回路,那么我們一筆就搞定了,那么我們可以把圖的每一個部分<聯通快>都檢查一遍,如果是

連通塊,那么就直接+1,如果不是歐拉回路<包括歐拉路>,那么我們就要統計這個連通塊的度數為奇數的點的個數s, 答案+s/2,原因是我們可以用s/2筆把所有的奇數度都填充完,一次填充兩個,當最后一筆的時候整個連通塊已經是一個歐拉回路了,然后我們必要把最后一筆抬起來,直接一筆畫就行了,還有就是提示下s永遠都是偶數,因為每當添加一筆的時候有四種情況新添加的這條邊的兩個端點 分別產生兩個度數為奇數的 + 2 分別消除兩個度數為奇數的 -2 分別一個消除,一個增加 +1-1 所以買個連通塊的奇數度點的個數很定是偶數個,總之最優的策略就是用最少的步數把每個一個連通塊變成歐拉回路,然后一筆搞定,還有就是要明確,我們并不是在填邊,而是說需要填邊的地方就是我們臺筆的地方,也就是要多花費一筆的地方。還有提示一點,可能出現獨立的一個點,獨立的點不用畫,其他的具體細節看代碼。


#include<stdio.h> #include<string.h>#define N_node 110000 #define N_edge 110000 typedef struct {int to ,next; }STAR;STAR E[N_edge]; int list[N_node] ,tot; int mer[N_node] ,du[N_node];void add(int a ,int b) {E[++tot].to = b;E[tot].next = list[a];list[a] = tot; }int finds(int x) {return x == mer[x] ? x : mer[x] = finds(mer[x]); }int main () {int i ,j ,n ,m ,a ,b;while(~scanf("%d %d" ,&n ,&m)){for(i = 1 ;i <= n ;i ++) mer[i] = i;memset(du ,0 ,sizeof(du));for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);mer[finds(a)] = finds(b);du[a] ++ ,du[b] ++;}memset(list ,0 ,sizeof(list)) ,tot = 1;for(i = 1 ;i <= n ;i ++){int x = finds(i);if(x == i) continue;add(x ,i);}int Ans = 0;for(i = 1 ;i <= n ;i ++){int tsum = 0;int x = finds(i);if(i != x || i == x && !list[x]) continue;tsum = du[i] % 2;for(int k = list[x] ;k ;k = E[k].next)tsum += du[E[k].to] % 2;(!tsum)? tsum ++ : tsum /= 2;Ans += tsum;}printf("%d\n" ,Ans);}return 0; }

總結

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

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