30分 DFS求救。。

P1041 [NOIP2003 提高组] 传染病控制

同求 三十分,WA&TLE 楼主有头绪了吗? ```cpp #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<vector> using namespace std; const int MAXN = 310,MAXP = 310; #define DEBUG(x) cout<< #x <<":"<< x <<endl inline int read(){ int x=0,w=1;char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')w=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } return x*w; } int n,p; int first[MAXN],f[MAXN]; vector<int> node[MAXP]; struct edge{ int u,v,w,next; //edge(int u,int v,int w=1,int next):u(u),v(v),w(w),next(next){} }e[MAXP*2]; int tot=0; void insert(int u,int v){ e[++tot].u=u;e[tot].v=v;e[tot].w=1;e[tot].next=first[u];first[u]=tot; } int fa[MAXN],d[MAXN],deep=0; void init(int x,int fat){ if(x!=1){ d[x]=d[fat]+1; fa[x]=fat; } deep=max(d[x],deep); node[d[x]].push_back(x); for(int i=first[x];i!=-1;i=e[i].next){ if(e[i].v!=fat){ init(e[i].v,x); } } } int find(int x){//找点x和他祖先是否被阻断过,是返回0(不可以感染) while(x!=1){ for(int i=first[x];i!=-1;i=e[i].next) if(e[i].v==fa[i]){ if(e[i].w==0)return 0; break; } x=fa[x]; } return 1; } int kill(int x){//返回杀死了多少人 int tot=0; for(int i=0;i<node[x].size();i++){ for(int j=first[node[x][i]];j!=-1;j=e[j].next){ if(e[j].v==fa[node[x][i]]&&e[j].w&&find(node[x][i])){ tot++; } } } return tot; } int ans=2147483647; void solve(int x,int o){ if(x==deep+1){ ans=min(ans,o); return; } if(o>=ans)return; for(int i=0;i<node[x].size();i++){ for(int j=first[node[x][i]];j!=-1;j=e[j].next){ if(e[j].v==fa[node[x][i]]){ e[j].w=0; int ki=kill(x); solve(x+1,o+ki); e[j].w=1; } } } } int main(){ memset(first,-1,sizeof(first)); n=read();p=read(); for(int i=1;i<=p;i++){ int u=read(),v=read(); insert(u,v);insert(v,u); } d[1]=0; init(1,-1); solve(1,1); printf("%d\n",ans); return 0; } ```
by Dark_Van @ 2019-02-19 17:27:29


30分 #include<bits/stdc++.h> using namespace std; int n,p,sum[310],ans,c[310],w[310][310],vis[310],h[310],cnt; int main() { scanf("%d%d",&n,&p); c[1]=1; for(int i=1;i<=p;i++) { int a,b; scanf("%d%d",&a,&b); if(a>b)swap(a,b); sum[a]++; w[a][b]=1; c[b]=c[a]+1; } for(int i=2;i<n;i++) { for(int j=i+1;j<=n;j++) { if(w[i][j]==1) sum[i]+=sum[j]; } } for(int i=2;i<=n;i++)sum[i]+=1; for(int i=2;i<=c[n];i++) { int maxx=0,num=0; for(int j=2;j<=n;j++) { if(c[j]==i&&vis[j]==0) if(maxx<sum[j]) { maxx=sum[j]; num=j; } } vis[num]=1; for(int l=num+1;l<=n;l++) if(w[num][l])vis[l]==1; ans+=maxx; } printf("%d",n-ans); return 0; }
by IOI_AKer_yyh @ 2019-03-24 14:56:26


30分 同求! ~~~cpp #include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct node { int nxt , to; }e[10100]; int n , m , siz[10100] , dep[10100] , res[10100][301] , cnt , head[10100] , ans = 2147483647; bool off[10100]; void add(int from,int to) { e[++cnt].to = to; e[cnt].nxt = head[from]; head[from] = cnt; } void dfs(int root,int step) { siz[root] = 1; dep[root] = step; res[step][++res[step][0]] = root; if(!head[root]) return; for(int i = head[root];i;i = e[i].nxt) { dfs(e[i].to,step+1); siz[root] += siz[e[i].to]; } } void fuck(int x) { off[x] = 1; for(int i = head[x];i;i = e[i].nxt) fuck(e[i].to); } void refuck(int x) { off[x] = 0; for(int i = head[x];i;i = e[i].nxt) refuck(e[i].to); } void search(int step,int now) { for(int i = 1;i <= res[step+1][0];i ++) { int to = res[step+1][i]; if(off[to]) continue; fuck(to); search(step+1,now-siz[to]); refuck(to); } ans = min(ans,now); } int main() { scanf("%d%d",&n,&m); for(int i = 1 , x , y , z;i <= m;i ++) { scanf("%d%d",&x,&y); add(x,y); } dfs(1,1); search(1,n); printf("%d\n",ans); return 0; } ~~~
by Treaker @ 2019-06-14 11:17:23


|