Hdu 3478 Catch
生活随笔
收集整理的這篇文章主要介紹了
Hdu 3478 Catch
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
如果出現遍歷圖中的某個點都是在奇數時刻或者偶數時刻,那么小偷的藏點就是根據時間判定在某些的奇數點和偶數點了。
如果圖出現奇數的環,即:有一個環由奇數個點組成,那么環中的某個點在奇數和偶數時刻都能到達(可以畫圖試試)。其實奇數環導致小偷藏點無規律的最大原因是:
在遍歷最后奇數環的兩個(必定是兩個)未遍歷點的時候他們是同奇(偶)的,然而還有一條邊直接相連。導致在下一時刻,那兩個點又可以同時變成偶(奇)。如果在回溯遍歷的話,就會出現整張圖在奇數時刻或者偶數時刻都能到達。
無向圖G為二部圖的充分必要條件是:
G至少有兩個頂點,且其所有回路的長度均為偶數。
如果我們把圖中奇數時刻能夠到達的點歸到X集合,偶數能到點歸到Y集合,那么如果圖中出現相同集合的點有
邊相連,那么就不滿足二分圖的性質,即可輸出YES,如果原圖可二分圖話,答案就是NO了。
然后就是經典的二分圖判定。
CODE:
?
#include<iostream>#include<cstdio>
#include<algorithm>
#include<cstring>
using?namespace?std;
const?int?MAXN?=?100010;
const?int?MAXM?=?500010;
struct?Edge
{
????int?v,?next;
}edge[MAXM];
int?n,?m,?s;
int?cnt;
int?first[MAXN];
bool?color[MAXN],?vis[MAXN];
void?init()
{
????cnt?=?0;
????memset(vis,?0,?sizeof(vis));
????memset(color,?0,?sizeof(color));
????memset(first,?-1,?sizeof(first));
}
void?read_graph(int?u,?int?v)
{
????edge[cnt].v?=?v;
????edge[cnt].next?=?first[u],?first[u]?=?cnt++;
}
int?find(int?u)
{
????for(int?e?=?first[u];?e?!=?-1;?e?=?edge[e].next)
????{
????????int?v?=?edge[e].v;
????????if(!vis[v])
????????{
????????????vis[v]?=?1;
????????????color[v]?=?!color[u];
????????????find(v);
????????}
????????else?if(color[u]?==?color[v])????return?false;
????}
????return?true;
}
int?main()
{
????int?T,?times?=?0;
????scanf("%d",?&T);
????while(T--)
????{
????????init();
????????scanf("%d%d%d",?&n,?&m,?&s);
????????while(m--)
????????{
????????????int?u,?v;
????????????scanf("%d%d",?&u,?&v);
????????????read_graph(u,?v);
????????????read_graph(v,?u);
????????}
????????printf("Case?%d:?",?++times);
????????color[s]?=?1;
????????vis[s]?=?1;
????????printf(find(s)?"NO\n":"YES\n");
????}
????return?0;
}
?
轉載于:https://www.cnblogs.com/g0feng/archive/2012/11/02/2751598.html
總結
以上是生活随笔為你收集整理的Hdu 3478 Catch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bitset 运算
- 下一篇: [9月29日的脚本] 枚举SharePo