HDU 3478 二分圖的判定。
阿新 • • 發佈:2019-01-03
題目:給你一個N個節點和M條邊的無向圖,並且給你一個起點X,小偷從起點X出發,每個單位時間只能從一點走到相鄰的點上。現在問你有沒有一個時刻小偷可能在地圖的任意節點上?
分析:
1.只要不是連通圖肯定不行。
2.如果是二分圖的話,一半是奇數時間能夠到達,一般是偶數時間能夠到達。
程式碼:
#include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=100000+10; const int maxm=500000+10; int n,m,s; vector<int> G[maxn]; int color[maxn]; int fa[maxn]; int find(int i) { if(fa[i]==-1) return i; return fa[i]=find(fa[i]); } bool bipartite(int u) { for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(color[v]==color[u]) return false; if(color[v]==0) { color[v]=3-color[u]; if(!bipartite(v)) return false; } } return true; } int main() { int T; scanf("%d",&T); for(int kase=1;kase<=T;kase++) { scanf("%d%d%d",&n,&m,&s); for(int i=0;i<n;i++) G[i].clear(); memset(color,0,sizeof(color)); memset(fa,-1,sizeof(fa)); for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); u=find(u), v=find(v); if(u!=v) fa[u]=v; } int cnt=0; //連通分量個數 for(int i=0;i<n;i++)if(find(i)==i) cnt++; if(cnt>1) { printf("Case %d: NO\n",kase); //這裡忘了Case %d了,WA了 continue; } bool sign=true; //存在完美時刻 color[s]=1; if(bipartite(s)) sign=false; printf("Case %d: %s\n",kase,sign?"YES":"NO"); } return 0; }