URAL 1169. Pairs 图中抽象出数学公式dfs
来源:互联网 发布:l女装淘宝店名 编辑:程序博客网 时间:2024/06/05 03:24
看上去是个图论题,其实可以从里面抽象出一个数学模型的。如果有m个连通分支,一共n个点,每个连通分支点的个数分别是a1,a2,,,,an那么a1*(n-a1)+a2*(n-a1-a2)+a3*(n-a1-a2-a3)+........=k。通过这种方法写的dfs不需要很多的剪枝。代码如下:
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#define MAXN 110using namespace std;int a[MAXN],k;int dfs(int n,int sum,int num){ if(sum==k&&n==0) return num; if(n==0) return 0; if(sum>k) return 0; for(int i=1; i<=n; i++) { if(i==2) continue; a[num]=i; int y=dfs(n-i,sum+i*(n-i),num+1); if(y) return y; } return 0;}int main(){ int n; cin>>n>>k; int u=dfs(n,0,1); if(!u) { cout<<-1<<endl; return 0; } int L=1,R=0; for(int i=1; i<u; i++) { if(i>1) { L=R+1; cout<<R<<" "<<L<<endl; } R+=a[i]; for(int j=L; j<R; j++) cout<<j<<" "<<j+1<<endl; if(L!=R) cout<<L<<" "<<R<<endl; } return 0;}
第二种:参考http://www.cnblogs.com/Chierush/p/3232723.html
利用了所有点的个数为n,并且n*n-2*k=a1^2+a2^2+…… 下面的这个dfs()很容易超时。。。。。
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#define MAXN 110using namespace std;int a[MAXN],k,nn;int dfs(int pre,int num,int sum1,int sum2){ if(sum1==nn&&sum2==nn*nn-2*k) return num; if((nn-sum1)*(nn-sum1)<nn*nn-2*k-sum2) return 0;//这个条件很强的,不加就会TLE。它的原理是(a+b)^2=a^2+b^2+2ab; for(int i=pre; i<=nn; i++) { if(i==2) continue; a[num]=i; if(sum1+i>nn||sum2+i*i>nn*nn-2*k) break; int y=dfs(i,num+1,sum1+i,sum2+i*i); if(y) return y; } return 0;}int main(){ cin>>nn>>k; int u=dfs(1,1,0,0); if(!u) { cout<<-1<<endl; return 0; } int L=1,R=0; for(int i=1; i<u; i++) { if(i>1) { L=R+1; cout<<R<<" "<<L<<endl; } R+=a[i]; for(int j=L; j<R; j++) cout<<j<<" "<<j+1<<endl; if(L!=R) cout<<L<<" "<<R<<endl; } return 0;}
做题时思路要灵活,特别是这个题中用到数学上的不等式进行优化- URAL 1169. Pairs 图中抽象出数学公式dfs
- URAL 1250. Sea Burial 从问题中抽象出DFS
- URAL 1106 Two Teams (DFS + 二分图)
- URAL 2060 Subpalindrome Pairs Manacher
- ural 1033. Labyrinth(dfs)
- ural 1171 DFS+DP
- URAL 1033 Labyrinth(DFS)
- ural 1119. Metro DFS
- ural 1033. Labyrinth dfs
- URAL 1033 Labyrinth (DFS)
- URAL 1242 Werewolf (DFS)
- URAL.1033 Labyrinth (DFS)
- ural 1033. Labyrinth dfs
- ural 1224. Spiral dfs
- Ural 1060. Flip Game dfs
- URAL 1298. Knight(DFS)
- URAL 1298 knight dfs搜索
- URAL 1022 Genealogical Tree (DFS)
- Ubuntu配置远程VNC远程桌面服务
- android中activity 生命周期说明
- EJB原理
- VIJOS P1351 棋盘制作
- 为C6713建立一个简单的工程
- URAL 1169. Pairs 图中抽象出数学公式dfs
- 谈Objective-C Block的实现
- HDU--杭电--1195--Open the Lock--深搜--忘记说句话装逼了,都是什么双向广搜,不知道怎么想的,直接就是一个深搜的水题好不好?
- poj 2752 Seek the Name, Seek the Fame
- oracle死进程查找与删除方法
- 【总结】文本文件与二进制文件读取的区别
- UNIX网络编程卷二 笔记 Posix消息队列
- Kubuntu下关闭触摸板
- g_idle_add函数介绍