您的位置:首页 > 其它

10160 - Servicing Stations(TLM)

2014-05-27 15:57 211 查看
DFS,剪枝了一些,还是TLM了,先放着……

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 35+1, M = N*N/2;
int a

;
bool vis
;
int n, m, ans;

void dfs(int buildNum, int cur, int nconn)
{
if(buildNum >= ans || cur > n+1)
return ;

int vising
;
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 town
bool 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 affect
if(isConn && vising_num == 0)
return ;

//+++
int nNewBuild = (isConn ? 0 : 1) + vising_num;

//build
dfs(buildNum+1, cur+1, nconn + nNewBuild);

//set back
if(!isConn)
vis[cur] = false;
while(vising_num)
{
vis[vising[--vising_num]] = false;
}
//not build
dfs(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unsolved