早上的开题答辩似乎是很水的样子,不过好像班上还是有一个人没通过,最后竟然发现我们这组的大boss是王伟,然后就没有然后了QAQ
poj3256
题意:有k头牛,n个顶点,m条路径,第i头牛从t[i]出发,问有多少个点是所有牛都可以到达的
分析:就是统计每一个顶点会被访问几次,若访问的次数正好等于k,则就是n头牛都可以到达的顶点
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=1010; 15 int k,n,m; 16 int t[100]; //记录每次的开始位置 17 int g[maxn][maxn]; //记录两点之间是否相互可达 18 int flag[maxn]; //标记访问过的点 19 int vis[maxn]; //标记这个点被访问了几次 20 void dfs(int h) 21 { 22 flag[h]=1; 23 vis[h]++; 24 for(int i=1;i<=n;i++) 25 { 26 if(!flag[i]&&g[h][i]) 27 dfs(i); 28 } 29 } 30 int main() 31 { 32 while(cin>>k>>n>>m) 33 { 34 for(int i=0;i<k;i++) 35 scanf("%d",&t[i]); 36 memset(g,0,sizeof(g)); 37 for(int i=0;i<m;i++) 38 { 39 int x,y; 40 scanf("%d%d",&x,&y); 41 g[x][y]=1; 42 } 43 memset(vis,0,sizeof(vis)); 44 for(int i=0;i<k;i++) 45 { 46 memset(flag,0,sizeof(flag)); 47 dfs(t[i]); 48 } 49 int cnt=0; 50 for(int i=1;i<=n;i++) 51 { 52 if(vis[i]==k) 53 cnt++; 54 } 55 cout<<cnt<<endl; 56 } 57 return 0; 58 }
poj2362
题意:有n个数,问是否能构成正方形
分析:只要能构成正方形的三边即可构成正方形,剪枝+dfs,若总长度不能被4整除,或者有一边的长度大于总长度的四分之一均不行,剪枝,然后对于剩下的情况按照按照数的从小到大进行排序,之后逆向进行dfs,这样做的目的是可以更快找到相应的边
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=25; 15 int a[maxn],vis[maxn]; 16 int n,cnt; 17 bool dfs(int pos,int len,int step) 18 { 19 if(step==3) return true; 20 for(int i=pos;i>=0;i--) //逆序更快 21 { 22 if(!vis[i]) 23 { 24 vis[i]=1; 25 if(len+a[i]<cnt){ 26 if(dfs(i-1,len+a[i],step)) return true; 27 }else if(len+a[i]==cnt) 28 { 29 if(dfs(n-1,0,step+1)) return true; 30 } 31 vis[i]=0; 32 } 33 } 34 return false; 35 } 36 int main() 37 { 38 int t; 39 cin>>t; 40 while(t--) 41 { 42 cin>>n; 43 memset(a,0,sizeof(a)); 44 int sum=0; 45 for(int i=0;i<n;i++) 46 { 47 cin>>a[i]; 48 sum+=a[i]; 49 } 50 memset(vis,0,sizeof(vis)); 51 sort(a,a+n); 52 if(sum%4||a[n-1]>sum/4) 53 { 54 cout<<"no"<<endl; 55 continue; 56 } 57 cnt=sum/4; 58 if(dfs(n-1,0,0)) 59 cout<<"yes"<<endl; 60 else 61 cout<<"no"<<endl; 62 } 63 64 return 0; 65 }