#19248: 想請教該如何剪枝


easylin0126@gmail.com (林榮翼)

學校 : 臺北市立成功高級中學
編號 : 89424
來源 : [140.114.207.162]
最後登入時間 :
2023-09-27 16:33:24
d233. 97北縣賽-4-金幣問題 -- 97學年度北基區資訊學科能力競賽 | From: [106.105.1.190] | 發表日期 : 2019-09-19 22:39

這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!

 
#19267: Re:想請教該如何剪枝


jackyname1@gmail.com (☆♬○♩程式家小崴●♪✧♩)

學校 : 基隆市私立二信高級中學
編號 : 77382
來源 : [114.32.51.178]
最後登入時間 :
2022-04-12 19:45:18
d233. 97北縣賽-4-金幣問題 -- 97學年度北基區資訊學科能力競賽 | From: [220.137.20.218] | 發表日期 : 2019-09-22 08:31

這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!

基本上 剪枝 就是 在搜尋(DFS or BFS) 時


遇到 不會影響答案或不可能是答案 的節點 時 直接 停掉

 
#19268: Re:想請教該如何剪枝


easylin0126@gmail.com (林榮翼)

學校 : 臺北市立成功高級中學
編號 : 89424
來源 : [140.114.207.162]
最後登入時間 :
2023-09-27 16:33:24
d233. 97北縣賽-4-金幣問題 -- 97學年度北基區資訊學科能力競賽 | From: [106.105.1.190] | 發表日期 : 2019-09-22 09:12

這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!

基本上 剪枝 就是 在搜尋(DFS or BFS) 時


遇到 不會影響答案或不可能是答案 的節點 時 直接 停掉

想請教還有什麼能改進的地方,我的程式碼如下,基本上就是求補圖的最大團,我有剪枝了QQ

#include<stdio.h>

#include<string.h> 

#include<algorithm>

using namespace std; 

bool map[100][100];

int ans=0,n,path[100];

void DFS(int num,int count){

int i;

ans=max(ans,count);

if(num==n+1||n-num+count+1<=ans)

return;

for(i=0;i<count;i++)

if(map[path[i]][num])

goto jump;

path[count]=num;

DFS(num+1,count+1);

jump:

DFS(num+1,count);

}

int main(){

int s,t;

scanf("%d",&n);

memset(map,0,sizeof(map));

while(scanf("%d",&s)&&s){

scanf("%d",&t);

map[s][t]=map[t][s]=1;

}

DFS(1,0);

printf("%d\n",ans);

}

 
#19269: Re:想請教該如何剪枝


easylin0126@gmail.com (林榮翼)

學校 : 臺北市立成功高級中學
編號 : 89424
來源 : [140.114.207.162]
最後登入時間 :
2023-09-27 16:33:24
d233. 97北縣賽-4-金幣問題 -- 97學年度北基區資訊學科能力競賽 | From: [106.105.1.190] | 發表日期 : 2019-09-22 09:13

這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!

基本上 剪枝 就是 在搜尋(DFS or BFS) 時


遇到 不會影響答案或不可能是答案 的節點 時 直接 停掉

想請教還有什麼能改進的地方,我的程式碼如下,基本上就是求補圖的最大團,我有剪枝了QQ

#include

#include 

#include

using namespace std; 

bool map[100][100];

int ans=0,n,path[100];

void DFS(int num,int count){

int i;

ans=max(ans,count);

if(num==n+1||n-num+count+1<=ans)

return;

for(i=0;i<count;i++)

if(map[path[i]][num])

goto jump;

path[count]=num;

DFS(num+1,count+1);

jump:

DFS(num+1,count);

}

int main(){

int s,t;

scanf("%d",&n);

memset(map,0,sizeof(map));

while(scanf("%d",&s)&&s){

scanf("%d",&t);

map[s][t]=map[t][s]=1;

}

DFS(1,0);

printf("%d\n",ans);

}


為什麼本來有縮排,貼上來就被吃掉阿!!

 
#19442: Re:想請教該如何剪枝


hq8398 (一群牛)

學校 : 國立花蓮高級中學
編號 : 88824
來源 : [1.164.108.193]
最後登入時間 :
2024-04-28 01:30:58
d233. 97北縣賽-4-金幣問題 -- 97學年度北基區資訊學科能力競賽 | From: [114.37.125.1] | 發表日期 : 2019-09-30 22:58

這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!

基本上 剪枝 就是 在搜尋(DFS or BFS) 時


遇到 不會影響答案或不可能是答案 的節點 時 直接 停掉

想請教還有什麼能改進的地方,我的程式碼如下,基本上就是求補圖的最大團,我有剪枝了QQ

#include

#include 

#include

using namespace std; 

bool map[100][100];

int ans=0,n,path[100];

void DFS(int num,int count){

int i;

ans=max(ans,count);

if(num==n+1||n-num+count+1<=ans)

return;

for(i=0;i<count;i++)

if(map[path[i]][num])

goto jump;

path[count]=num;

DFS(num+1,count+1);

jump:

DFS(num+1,count);

}

int main(){

int s,t;

scanf("%d",&n);

memset(map,0,sizeof(map));

while(scanf("%d",&s)&&s){

scanf("%d",&t);

map[s][t]=map[t][s]=1;

}

DFS(1,0);

printf("%d\n",ans);

}


為什麼本來有縮排,貼上來就被吃掉阿!!

雖然沒有看懂您的code(因為縮排問題),但是感覺這題不該用DFS做吧,感覺比較像是二分圖的題目


 
ZeroJudge Forum