这里基本就是入门吧。
可达性统计 用bitset搞的判重,发现这东西是真好用哈,空间还小
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<map> #include<bitset> using namespace std; map<int,bool>mp[31000]; struct node { int x,y,next; }a[31000];int len,last[31000]; void ins(int x,int y) { len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len; } int top,sta[31000]; int ru[31000]; bitset<30010>s[31000]; int main() { int n,m; scanf("%d%d",&n,&m); len=0;memset(last,0,sizeof(last)); memset(ru,0,sizeof(ru)); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); if(mp[x][y]==false) { ins(y,x);ru[x]++; mp[x][y]=true; } } top=0; for(int i=1;i<=n;i++) { if(ru[i]==0)sta[++top]=i; s[i][i]=1; } while(top!=0) { int x=sta[top];top--; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; ru[y]--;s[y]|=s[x]; if(ru[y]==0) sta[++top]=y; } } for(int i=1;i<=n;i++)printf("%d ",s[i].count()); return 0; }
小猫爬山 就冲着Freda和rainbow这口狗粮随便写了。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<map> #include<bitset> using namespace std; int n,W,mmin; int c[20],d[20]; void dfs(int k,int sp) { if(sp>=mmin)return ; if(k==n+1) { mmin=sp; return ; } for(int i=1;i<=sp;i++) if(d[i]+c[k]<=W) { d[i]+=c[k]; dfs(k+1,sp); d[i]-=c[k]; } d[sp+1]=c[k]; dfs(k+1,sp+1); } int main() { scanf("%d%d",&n,&W); for(int i=1;i<=n;i++)scanf("%d",&c[i]); d[1]=0;mmin=n;dfs(1,1); printf("%d ",mmin); return 0; }
数独那题不大想做啊。