HDU5424Rikka with Graph II(哈密頓圖判斷)
題目連結:傳送門
分析(轉自bestcoder):
如果圖是聯通的,可以發現如果存在哈密頓路徑,一定有一條哈密頓路徑的一端是度數最小的點,從哪個點開始直接DFS搜尋哈密頓路徑複雜度是 O(n)的。要注意先判掉圖不連通的情況。
程式碼如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 1e3+10;
int degree[maxn];
bool vis[maxn];
vector<int >vc[maxn];
void init(){
for(int i=0;i<maxn;i++){
degree[i]=0;
vc[i].clear();
vis[i]=0;
}
}
int mp[maxn][maxn];
int n;
void dfs1(int u,int &num){
num++;
vis[u]=1;
for(int i=0;i<vc[u].size();i++){
int v = vc[u][i];
if(!vis[v])
dfs1(v,num);
}
}
bool dfs2(int u,int pre,int num){
vis[u]=1;
num++;
if(num==n) return 1;
for(int i=0;i<vc[u].size();i++){
int v = vc[u][i];
if(v!=pre&&!vis[v]){
if(dfs2(v,u,num))
return 1;
}
}
vis[u]=0;
return 0;
}
int main()
{
while(~scanf("%d",&n)){
init();
memset(mp,0,sizeof(mp));
for(int i=0;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u==v||mp[u][v]) continue;
vc[u].push_back(v);
vc[v].push_back(u);
mp[u][v]=1;
mp[v][u]=1;
degree[u]++;
degree[v]++;
}
int num=0;
dfs1(1,num);
if(num!=n){
puts("NO");
continue;
}
int st=1,d=10000000;
for(int i=1;i<=n;i++){
if(degree[i]<d)
st=i,d=degree[i];
}
memset(vis,0,sizeof(vis));
if(dfs2(st,0,0)) puts("YES");
else puts("NO");
}
return 0;
}
相關文章
- 哈密頓路徑
- Touring cities (找規律 哈密爾頓迴路)
- 一類哈密頓路徑/迴路為背景的狀壓dp
- iOS 常用圖片格式判斷 (Swift)iOSSwift
- [Python手撕]判斷二分圖Python
- 判斷img圖片是否載入成功
- python如何判斷圖片是否為空Python
- PbootCMS內容頁判斷有無多圖,無多圖顯示縮圖各種條件判斷和標籤boot
- UML圖中時序圖的新增判斷條件時序圖
- 怎麼判斷dns汙染,怎麼判斷dns汙染,具體判斷方法DNS
- JS的判斷語句:判斷、迴圈JS
- 判斷一個有向圖是否有環
- if 判斷使用
- 如何判斷一個點在地圖上?如何判斷一個點在多邊形內?地圖
- 使用帶型別判斷的比較判斷型別
- js函式中的if判斷和a==b判斷JS函式
- 百度地圖電子圍欄判斷地圖
- 正則判斷MIME 型別是否是圖片型別
- PHP判斷檔案是否為圖片的方法PHP
- Graph Embedding圖嵌入
- 圖論(Graph Theory)圖論Graph Theory
- 判斷空值
- 素數判斷
- 原型判斷方法原型
- 判斷素數
- 判斷語句
- 判斷難點
- nginx 多if判斷。Nginx
- 如何判斷股票有沒有主力?主力的判斷方法
- cv2 判斷圖片是冷還是暖
- 從txt中讀取邊,判斷圖的連通性
- nginx判斷路徑是否含有某個引數做判斷Nginx
- C語言判斷素數,判斷質素演算法C語言演算法
- CMAKE 中平臺判斷
- js判斷型別JS型別
- js判斷時間JS
- 判斷負環模板
- 正規化判斷
- JavaScript 判斷閏年JavaScript