P1197 [JSOI2008]星球大战

不同的结构形成的结果也不同。。

#include
#include
#include
#include
#include
#include
#define MAXN 200010
using namespace std;
int n,m,fa[MAXN*2],key[MAXN*2],ans,out[MAXN*2],anss,k,t=1,a,b;
vector G[MAXN*2];//不开大会RE的 
stack s;
inline int read()//读入优化 
{
    int s=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
    return s*f;
}
int find(int x)//并查集 
{
    if(fa[x]!=x)
    {
        fa[x]=find(fa[x]);       //路径压缩 
    }
    return fa[x];
}
int onion(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)
    {
        ans++;//当两个元素不在同一个集合中的时候 用ans记录一下减少了几个联通块
                //也就是说每当有两个不同的集合被合并的时候 联通块数量-1 
        fa[fx]=fy;
    }
}
void init()//输入 
{
    memset(key,1,sizeof(key));
    n=read();m=read();
    for(int i=0;i

我的代码只通过了50%..


#include 

using namespace std;

int n,m;
int k;
int const maxn =400010;

int f[maxn],vis[maxn];
int cnn;
struct Edge {
    int from,to;
    Edge(int _from,int _to):from(_from),to(_to){}
};
queue all,res;
stack ans;
stack star;
vector edges;
vector G[maxn],G2[maxn];
int find_f(int x) {

  return f[x]!=x?f[x]=find_f(f[x]):x;

}

void add_edges(int from,int to)
{
    Edge e1(from,to),e2(to,from);
    edges.push_back(e1);
    G[e1.from].push_back(edges.size()-1);
    edges.push_back(e2);
    G[e2.from].push_back(edges.size()-1);

}

void union_set(int x,int y) {

    int rx = find_f(x);

    int ry = find_f(y);

    if(rx!=ry) {

        f[ry] = rx;
        cnn--;

    }

}



bool query(int x,int y){

    int rx = find_f(x);

    int ry = find_f(y);

    if(rx!=ry) return false;

    return true;

}


void work() {
    int label = star.top();
    star.pop();

    if(label==-1) {
       stack tt=star;
       set s;
       while(!tt.empty())
       {
           int temp = tt.top();tt.pop();
           for(int i=0;i>n>>m;
    int fo,t;
    for (int i=0;i>fo>>t;
       add_edges(fo,t);
    }

    cin>>k;
    cnn=n;
    for (int i=0;i>fo;
        vis[fo] = 0;
        star.push(fo);
    }
    star.push(-1);

    while(!star.empty())
    {
        work();
        ans.push(cnn-star.size());

    }
    while(!ans.empty())
    {
        cout<

 

你可能感兴趣的:(图论)