3 条题解
-
1
#include<bits/stdc++.h> #define rg register #define il inline #define Min(a,b) (a)<(b)?(a):(b) #define Max(a,b) (a)>(b)?(a):(b) using namespace std; const int N=1510; void in(int &ans) { ans=0; char i=getchar(); while(i<'0' || i>'9') i=getchar(); while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar(); } int n,cur; int to[N<<1],nex[N<<1],head[N]; int dp[N][2]; il void add(int a,int b) { to[++cur]=b; nex[cur]=head[a]; head[a]=cur; } il void read() { for(rg int i=1;i<=n;i++) { int x,k,y; in(x),in(k); for(rg int j=1;j<=k;j++) { in(y); add(x,y),add(y,x); } } } void dfs(int u,int fa) { dp[u][1]=1,dp[u][0]=0; for(rg int i=head[u];i;i=nex[i]) { if(to[i]==fa) continue; dfs(to[i],u); dp[u][0]+=dp[to[i]][1]; dp[u][1]+=Min(dp[to[i]][1],dp[to[i]][0]); } } int main() { in(n); read(); dfs(0,-1); printf("%d\n",Min(dp[0][0],dp[0][1])); return 0; }
-
0
核心代码
typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A const ll N=4000; const ll INF=1e9+9; const ll mod=2147483647; const double EPS=1e-10;//-10次方约等于趋近为0 const double Pi=3.1415926535897; struct node { ll v,nex; }e[N]; ll head[N],cnt,n,m,k,x; ll f[N][2];//二维的只需要0或1即可,开大了memset会超时 ll t,arr[N],rt; inline void add(ll u,ll v) { e[++cnt].nex=head[u]; e[cnt].v=v; head[u]=cnt; } inline void init() { memset(f,0,sizeof f); memset(head,0,sizeof head); memset(arr,0,sizeof arr); cnt=0; } void dfs(ll u) { f[u][0]=0,f[u][1]=1;//站或不站,站则至少需要1名士兵 for(ll i=head[u];i;i=e[i].nex) { dfs(e[i].v);//往下遍历 f[u][0]+=f[e[i].v][1];//若不站则相邻的必须站有士兵 f[u][1]+=min(f[e[i].v][1],f[e[i].v][0]); } } int main() { while(scanf("%lld",&n)!=EOF) { init(); over(j,1,n) { ll a,b; scanf("%lld%lld",&a,&b); over(i,1,b) { ll c; scanf("%lld",&c); arr[c]++; add(a,c);//树是有向图 } } over(i,0,n) { if(!arr[i])//找根 { rt=i; break; } } dfs(rt); printf("%lld\n",min(f[rt][1],f[rt][0])); } }
-
0
#include<bits/stdc++.h> using namespace std; const int N=1510; int n,m,k,s,t,x,y,f[N][2]; vector<int> e[N]; void dfs(int u,int fa) { f[u][1]=1,f[u][0]=0; for(int &v:e[u]) { if(v==fa) continue; dfs(v,u); f[u][0]+=f[v][1]; f[u][1]+=min(f[v][1],f[v][0]); } } int main() { cin>>n; for (int i=1;i<=n;++i){ cin>>x>>k; for (int j=1;j<=k;++j){ cin>>y; e[x].push_back(y); e[y].push_back(x); } } dfs(0,-1); cout<<min(f[0][0],f[0][1]); }
- 1
信息
- ID
- 129
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 97
- 已通过
- 51
- 上传者