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;
}
本文介绍了一种用于解决图中节点连接问题的算法。通过使用并查集和映射表等数据结构,该算法能够有效地处理节点间的连接和查询操作。文章详细解释了算法的实现过程,并提供了完整的代码示例。
3811

被折叠的 条评论
为什么被折叠?



