uva 10160
题目大意:有n个点(3<=n<=35),有m条边连接点与点。如果在某个点安装电灯,该点与相连的点都有光亮。写个程序装最小的灯使所有点都有光亮。若干组数据,以n=0 m=0结束。
样例输入
8 12
1 2
1 6
1 8
2 3
2 6
3 4
3 5
4 5
4 7
5 6
6 7
6 8
8 10
1 2
1 3
1 4
1 5
6 2
6 3
6 4
6 5
1 7
7 8
0 0
样例输出
2
2
我的程序不知错哪了
程序代码:
#include<cstdio> #include<cstring> #define oo 2000000000 #define min(a,b)((a)<(b)?(a):(b)) int n,m,x,y,ans; int road[36][36]; bool map[36][36]; void doit(int num,int x,bool a[],int station) { if (!a[x]) return; station++; num++; a[x]=false; for (int i=1;i<=road[x][0];i++) if (a[road[x][i]]) { num++; a[road[x][i]]=false; } if (num==n) { ans=min(ans,station); return; } for (int j=x+1;j<=n;j++) doit(num,j,a,station); } int main() { bool b[36]; freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); while (scanf("%d%d",&n,&m)==2 && (n || m)) { //special if (m==0) {printf("%d\n",n); continue;} //fill memset(road,0,sizeof(road)); memset(map,false,sizeof(map)); memset(b,true,sizeof(b)); ans=oo; //read for (int i=1;i<=m;i++) { scanf("%d%d",&x,&y); if (x==y) continue; map[x][y]=map[y][x]=true; road[x][++road[x][0]]=y; road[y][++road[y][0]]=x; } //doit for (int i=1;i<=n;i++) { doit(0,i,b,0); memset(b,true,sizeof(b)); } //print printf("%d\n",ans); } return 0; }