uva 10160服务站
2012-11-10 14:33
357 查看
最小顶点覆盖问题,依次按修建服务站的个数从小到大dfs ,有几个优化:1、入度为0的点一定要用,used=1; 2、入度为1的点不用,used=-1,与它相连的那个点用,used=1;3、所有点按入度降序排列;4.、用late表示该点之后的点全用上的状态,与当前状态相加来判断当前路径是否能到达终点;5、用长整型来表示集合
#include<stdio.h> #include<string.h> #include<stdlib.h> int n,m; _int64 q; struct node{ int ru[2]; int used; _int64 sta; int num; _int64 late; }st[40]; int min; int depth; int flag; int cmp(const void*a,const void*b) { node* c=(node*)a; node* d=(node*)b; if(c->ru[0]<d->ru[0]) return 1; else return 0; } void dfs(_int64 p,int s,int next) { if(s==depth&&p!=q) return; if(s>depth) return; if(p==q&&s==depth) { min=depth; flag=1; return; } int i,j; for(i=next;i<=n;i++) { if(st[i].used==1) { p=p|st[i].sta; dfs(p,s+1,i+1); } else if(st[i].used==-1) continue; else //if(st[i].used==0) { if(p|st[i].sta!=p) { if(p|st[i].late==q) dfs(p|st[i].sta,s+1,i+1); } } if(flag) return; } } int main() { int i,j,k,l,s; for(;;) { scanf("%d%d",&n,&m); if(n==0&&m==0) break; s=0;min=100;flag=0; q=((_int64)1<<n)-1; for(i=1;i<=n;i++) { st[i].sta=st[i].sta|(_int64)1<<(i-1); st[i].ru[0]=0; st[i].used=0; st[i].num=i; } for(i=0;i<m;i++) { int a,b; scanf("%d %d",&a,&b); st[a].sta=st[a].sta|(_int64)1<<(b-1); st[b].sta=st[b].sta|(_int64)1<<(a-1); st[a].ru[0]++;st[b].ru[0]++; st[a].ru[1]=b;st[b].ru[1]=a; } qsort(st+1,n,sizeof(st[0]),cmp); st .late=st .sta; for(i=n-1;i>=1;i--) { st[i].late=st[i+1].late|st[i].sta; } for(i=1;i<=n;i++) { if(st[i].ru[0]==0) { st[i].used=1; s++; } if(st[i].ru[0]==1&&st[i].used==0) { st[i].used=-1; for(j=1;j<=n;j++) { if(st[j].num==st[i].ru[1]) { st[j].used=1; s++; break; } } } } for(depth=1;depth<=n;depth++) { dfs(0,0,1); if(flag) { printf("%d\n",min); break; } } } return 0; }
相关文章推荐
- UVa Problem 10160 Servicing Stations (服务站)
- Uva 307木棍、387谜题、10160服务站总结
- UVA-10160-servig stations(服务站)
- UVa 10160 - Servicing Stations
- UVa 10160 - Servicing Stations
- uva10160 Servicing Stations
- UVA10160在一个图中选择几个点,使得这些点加上相邻的点为这个图的顶点集
- uva 10160 Servicing stations
- uva10160 Servicing Stations
- uva 10160 Servicing stations
- uva 10160 Servicing Stations(DFS+剪枝)
- uva 10160 Servicing Stations(DFS+剪枝)
- uva 10160(回溯)
- UVA 10160 Servicing Stations
- UVA10160
- uva 10160
- uva 10160 Servicing Stations
- UVA 10160 - Servicing Stations
- uva 10160
- UVA 10160 Servicing Stations