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;
}
#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;
}
相关文章推荐
- uva 10160 Servicing Stations(DFS+剪枝)
- UVM::TLM
- tlm源码分析——interface class和port_base
- UVA 10160 Servicing Stations(深搜 + 剪枝)
- UVA - 10160 Servicing Stations 剪枝+回溯
- uvm设计分析——tlm
- UVA 10160 Servicing Stations(深搜 + 剪枝)
- uvm uvm_tlm_fifo的使用
- uvm_tlm——TLM1事务级建模方法(一)
- UVa 10160 - Servicing Stations
- UVa 10160 Servicing stations解题报告
- uvm_analysis_port——TLM1事务级建模方法(二)
- uva 10160 - Servicing Stations
- uva 10160 Servicing stations
- uvm_tlm_if_base——TLM1事务级建模方法(三)
- uva 10160
- uva 10160 Servicing stations
- uvm_sqr_ifs——TLM1事务级建模方法(四)
- uva 10160 Servicing Stations
- uva 10160 Servicing Stations