這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!
這題我把它轉換成求補圖的最大團,不過一直NA (score:90%) QQ,在第七筆測資中TLE,我只會判斷如果接下來的點加上已經放入最大團的點的值小於等於目前的最佳解就剪枝,在網路上看到一些剪枝的做法不過都不太懂,想請教一下有什麼剪枝的辦法!!
基本上 剪枝 就是 在搜尋(DFS or BFS) 時
遇到 不會影響答案或不可能是答案 的節點 時 直接 停掉
這題我把它轉換成求補圖的最大團,不過一直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);
}
這題我把它轉換成求補圖的最大團,不過一直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);
}
為什麼本來有縮排,貼上來就被吃掉阿!!
這題我把它轉換成求補圖的最大團,不過一直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做吧,感覺比較像是二分圖的題目