【洛谷】P1197 [JSOI2008]星球大戰
阿新 • • 發佈:2017-12-29
如果 scanf node 新建 turn spa ble space ans
原題
這道題目在一開始想的時候我感覺沒有什麽思路,然後仔細一想,如果可以重新建邊呢???
我們不妨先把所有點都設定為一個孤獨的島嶼,然後不斷連邊,所有第一個的答案就出來了!!!
然後每一次我們可以增加一個點,然後把所有與他有關的邊連接起來,就!!!AC了!
#include<bits/stdc++.h> #define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout); using namespace std; const int maxm=200010,maxn=2*maxm; int beat[maxn],front[maxn]; int f[maxn]; int find(int x){ if(f[x]!=x)f[x]=find(f[x]); return f[x]; } int ans[maxn]; void join(int x,int y){ x=find(x);y=find(y); if(x!=y)f[y]=x; } struct node{ int to,next,now; }e[maxn]; int cnt,die[maxn]; void Add(int x,int y){ e[++cnt].to=y; e[cnt].next=front[x]; front[x]=cnt; e[cnt].now=x; } int main(){ int i,j,k,n,m; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); Add(x,y); Add(y,x); } scanf("%d",&k); for(i=1;i<=k;i++){ scanf("%d",&beat[i]); die[beat[i]]=1; } for(i=0;i<=n;i++) f[i]=i; int tot=n-k; for(i=1;i<=2*m;i++) if(!die[e[i].to] && !die[e[i].now]){ int u=e[i].now,v=e[i].to; if(find(u)!=find(v)){ tot--;join(u,v); } } ans[k+1]=tot; for(i=k;i>=1;i--){ int u=beat[i]; tot++; die[u]=0; for(j=front[u];j;j=e[j].next){ int v=e[j].to; if(!die[v] && find(u)!=find(v)){ tot--; join(u,v); } } ans[i]=tot; } for(i=1;i<=k+1;i++)printf("%d\n",ans[i]); return 0; } /* Input: 8 13 0 1 1 6 6 5 5 0 0 6 1 2 2 3 3 4 4 5 7 1 7 2 7 6 3 6 5 1 6 3 5 7 Output: 1 1 1 2 3 3 */
【洛谷】P1197 [JSOI2008]星球大戰