在线设计网站排名,百度统计 网站速度诊断,网站建设技术工具,东阳网站建设公司正题
题目链接 大意
有n个星球#xff0c;有一些双向通道连接星球#xff0c;将一些星球实施打击。求开始和每一次打击后的联通块数量。 解题思路
可以尝试一下逆向思维#xff0c;把摧毁改为连接#xff0c;然后倒着输出。 代码
#includecstdio
#includei…正题
题目链接 大意
有n个星球有一些双向通道连接星球将一些星球实施打击。求开始和每一次打击后的联通块数量。 解题思路
可以尝试一下逆向思维把摧毁改为连接然后倒着输出。 代码
#includecstdio
#includeiostream
using namespace std;
struct line{int x,y,next;
};
line a[400001];
int o,w,p,xx,yy,n,m,father[400001],s,ls[400001],q,mark[400001],br[400001];
bool v[400001];
int find(int x)
{if (x!father[x]) return father[x]find(father[x]);return father[x];
}
int unionn(int x,int y)
{int fafind(x),fbfind(y);if (fa!fb){if (fafb) father[fb]fa;else father[fa]fb;s--;}
}
int main()
{scanf(%d%d,n,m);for (int i1;in;i) father[i]i;for (int i1;im;i){scanf(%d%d,xx,yy);xx;yy;a[p].xxx;a[p].yyy;a[p].nextls[xx];ls[xx]p;a[p].yxx;a[p].xyy;a[p].nextls[yy];ls[yy]p;}//输入scanf(%d,w);for (int i1;iw;i){scanf(%d,br[i]);br[i];//记录打击顺序v[br[i]]true;//标记打击}sn-w;//计算剩余星球数for (int i1;ip;i){if (!v[a[i].x] !v[a[i].y])//没用被打击{unionn(a[i].x,a[i].y);//连接}}mark[o]s;//记录for (int iw;i1;i--){s;v[br[i]]false;//建立qls[br[i]];while (q){if (!v[a[q].y])unionn(br[i],a[q].y);//连接qa[q].next;}mark[o]s;//记录}for (int io;i1;i--) printf(%d\n,mark[i]);//输出
}