10160 - Servicing Stations(TLM)

来源:互联网 发布:学java最好的学校 编辑:程序博客网 时间:2024/04/20 01:33

DFS,剪枝了一些,还是TLM了,先放着……

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 35+1, M = N*N/2;int a[N][N];bool vis[N];int n, m, ans;void dfs(int buildNum, int cur, int nconn){if(buildNum >= ans || cur > n+1)return ;int vising[N];int vising_num = 0;bool ok = true;//all town is conneted//for(int i = 1; i <= n; i++)//if(!vis[i])//ok = false;//+++if(nconn != n)ok = false;if(ok){ans = buildNum;return ;}//bulid in cur and mark neighbouring townbool isConn = vis[cur];vis[cur] = true;for(int i = 1; i <= n; i++){if(a[cur][i] && !vis[i]){vis[i] = true;vising[vising_num++] = i;}}//prune: build but haven't affectif(isConn && vising_num == 0)return ;//+++int nNewBuild = (isConn ? 0 : 1) + vising_num;//builddfs(buildNum+1, cur+1, nconn + nNewBuild);//set backif(!isConn)vis[cur] = false;while(vising_num){vis[vising[--vising_num]] = false;}//not builddfs(buildNum, cur+1, nconn);}void solve(){ans = 0x3f3f3f3f;memset(vis, 0, sizeof(vis));dfs(0, 1, 0);}int main(){freopen("in.txt", "r", stdin);while(scanf("%d%d", &n, &m), n+m){int u, v;memset(a, 0, sizeof(a));for(int i = 0; i < m; i++){scanf("%d%d", &u, &v);a[u][v] = a[v][u] = 1;//conn[u]++, conn[v]++;}solve();printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击