Connections in Galaxy War (逆向并查集)

来源:互联网 发布:阿里云免费镜像 编辑:程序博客网 时间:2024/05/17 06:16


Connections in Galaxy War

 ZOJ - 3261 



从这里学到了这些东西。。


map<int,string>mp[10];   这地方是可以这样用的。。这样就把原本是二维的数组变为了1维,下面也能很好地体现这个例子    mp[1][2]="adsf";


#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>#include <map>using namespace std;const int MAXN=10010;int F[MAXN];int p[MAXN];int val[MAXN];//最大值的下标int num[MAXN];//最大值int find(int x){    if(F[x]==-1)return x;    return F[x]=find(F[x]);}void bing(int u,int v){    int t1=find(u),t2=find(v);    if(t1!=t2)    {        F[t1]=t2;        if(num[t1]>num[t2])        {            num[t2]=num[t1];            val[t2]=val[t1];        }        else if(num[t1]==num[t2] && val[t2]>val[t1])            val[t2]=val[t1];    }}map<int,int>mp[MAXN];//这个map很好,用一维来判断了某条边是否存在。struct Edge{    int u,v;}edge[20010];bool used[20010];struct Node{    int op;    int u,v;}node[50010];int ans[50010];char str[20];int main(){    int n;    int Q;    int m;    int u,v;    bool first=true;    while(scanf("%d",&n)==1)    {        if(first)first=false;        else printf("\n");        memset(F,-1,sizeof(F));        for(int i=0;i<n;i++)        {            scanf("%d",&p[i]);            val[i]=i;            num[i]=p[i];            mp[i].clear();        }        scanf("%d",&m);        for(int i=0;i<m;i++)        {            scanf("%d%d",&u,&v);            if(u>v)swap(u,v);            mp[u][v]=i;            edge[i].u=u;            edge[i].v=v;            used[i]=false;        }        scanf("%d",&Q);        for(int i=0;i<Q;i++)        {            scanf("%s",&str);            if(str[0]=='q')            {                node[i].op=0;                scanf("%d",&node[i].u);            }            else            {                node[i].op=1;                scanf("%d%d",&u,&v);                if(u>v)swap(u,v);                node[i].u=u;                node[i].v=v;                int tmp=mp[u][v];                used[tmp]=true;            }        }        for(int i=0;i<m;i++)          if(!used[i])          {              bing(edge[i].u,edge[i].v);          }        int cnt=0;        for(int i=Q-1;i>=0;i--)        {            if(node[i].op==0)            {                u=node[i].u;                int t1=find(u);                if(num[t1]>p[u])ans[cnt++]=val[t1];                else ans[cnt++]=-1;            }            else            {                bing(node[i].u,node[i].v);            }        }        for(int i=cnt-1;i>=0;i--)printf("%d\n",ans[i]);    }    return 0;}




0 0