/*
+
+
+
+
[ >i>n[t
*/ #include<stdio.h>
/*2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1;
*/int/**/main(int/**/n,char**m){FILE*p,*q;int A,k,a,r,i/*
#uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d="P%" "d\n%d\40%d"/**/
"\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**"
"/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*="
"yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?"
"*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni("/**
*/"i+k[>+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2"
":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[
i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1] !='\0'))?fopen(m[1],y+298):stdin;
/*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m] =<2<5<64;}-]-(m+;yry[rm*])/[*
*/q=(n<3||!(m[2][0]-'-'||m[2][1]))?stdout /*]{ }[*/:fopen(m[2],d+14);if(!p||/*
"]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++" <)< ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/)
return+printf("Can " "not\x20open\40%s\40" "" "for\40%sing\n",m[!p?1:2],!p?/*
o=82]5<<+(+3+1+&.(+ m +-+1.)<)<|<|.6>4>-+(> m- &-1.9-2-)-|-|.28>-w-?-m.:>([28+
*/"read":"writ");for ( a=k=u= 0;y[u]; u=2 +u){y[k++ ]=y[u];}if((a=fread(b,1,1024/*
,mY/R*Y"R*/,p/*U*/)/* R*/ )>/*U{ */ 2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\}
*/sscanf(b,d,&k,& A,& i, &r)&& ! (k-6&&k -5)&&r==255){u=A;if(n>3){/*
]&<1<6<?<m.-+1>3> +:+ .1>3+++ . -m-) -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8*/
u++;i++;}fprintf (q, d,k, u >>1,i>>1,r);u = k-5?8:4;k=3;}else
/*]>*/{(u)=/*{ p> >u >t>-]s >++(.yryr*/+( n+14>17)?8/4:8*5/
4;}for(r=i=0 ; ;){u*=6;u+= (n>3?1:0);if (y[u]&01)fputc(/*
<g-e<t.c>h.a r -(-).)8+<1. >;+i.(<)< <)+{+i.f>([180*/1*
(r),q);if(y[u ]&16)k=A;if (y[u]&2)k--;if(i/*
("^w^NAMORI; { I*/==a/*" )*/){/**/i=a=(u)*11
&255;if(1&&0>= (a= fread(b,1,1024,p))&&
")]i>(w)-;} { /i-f-(-m--M1-0.)<{"
[ 8]==59/* */ )break;i=0;}r=b[i++]
;u+=(/**>> *..</<<<)<[[;]**/+8&*
(y+u))?(10- r?4:2):(y[u] &4)?(k?2:4):2;u=y[u/*
49;7i\(w)/;} y}ru\=*ri[ ,mc]o;n}trientuu ren (
*/]-(int)'`';} fclose( p);k= +fclose( q);
/*] <*.na/m*o{ri{ d;^w^;} }^_^}}
" */ return k- -1+ /*\' '-`*/
( -/*}/ */0x01 ); {;{ }}
; /*^w^*/ ;}
主要实现功能:
(1)输入n个学生信息,如果是同学关系,则为邻接关系,建立无向图。
(2)任输入两个学生姓名,输出这两个学生之间至少隔着多少同学,才能相互联系,并输出相隔的同学姓名。
(3)任输入两个学生姓名,输出这两个学生之间最多隔着多少同学,才能相互联系,并输出相隔的同学姓名。
代码如下:
#include<bits/stdc++.h>
#include<map>
#define MAX 100
using namespace std;
int visit_1[MAX],visit_2[MAX];
typedef struct
{
int arcs[MAX][MAX]; //邻接矩阵
int vexnum,arcnum; //学生人数和所有学生的关系总数
} MGraph;
void BFS(MGraph G, int c, int d);
void DFS(MGraph G, int c, int d);
void print_DFS();
map<int,string>mp;
int main()
{
int a,b,c,d;
MGraph G;
string stu;//学生姓名
printf("请输入学生人数和所有学生的关系总数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("录入学生信息:\n");
for(int i=0; i<G.vexnum; i++)
{
printf("输入编号为%d的学生:",i);
cin>>stu;
mp[i]=stu;
}
for(int i=0; i<G.vexnum; i++)
{
for(int j=0; j<G.vexnum; j++)
{
G.arcs[i][j]=0;
}
}
for(int i=0; i<G.arcnum; i++)
{
scanf("%d %d",&a,&b);
G.arcs[a][b]=1;
G.arcs[b][a]=1;
}
printf("请输入两个要查询的学生编号:");
scanf("%d %d",&c,&d);
BFS(G,c,d);
DFS(G,c,d);
print_DFS();
return 0;
}
void BFS(MGraph G, int c, int d)
{
int path[MAX]= {0},flag_1=1,count=0,arr[MAX],k;
visit_1[c]=1;
int q[MAX],z=0,y=0;
q[y++]=c;
while(z!=y)
{
int u=q[z++];
for(int j=0; j<G.vexnum; j++)
{
if((G.arcs[u][j]==1)&&(visit_1[j]==0))
{
path[j]=u;//path[]数组下标为当前节点,数据为上一个节点,用来存储最短路径
if(j==d)
{
flag_1=0;
break;
}
visit_1[j]=1;
q[y++]=j;
}
}
if(flag_1==0)
break;
}
k=d;
while(path[k]!=c)
{
k=path[k];
arr[count++]=k;
}
if(flag_1==1)
printf("这两个同学之间没有关系\n");
else if(count==0)
printf("这两个同学之间没有学生间隔\n");
else
{
printf("至少隔着%d位同学: ",count);
for(int i=count-1; i>=0; i--)
{
cout<<mp[arr[i]]<<" ";
}
printf("\n");
}
}
int s[MAX],arry[MAX],sum=0,top=0,flag_2=0;
void DFS(MGraph G, int start, int en)
{
if(start==en)
{
flag_2=1;
if(top>sum)
{
sum=top;
for(int i=0; i<top; i++)
arry[i]=s[i];
}
return;
}
visit_2[start]=1;//标记被访问过
s[top++]=start;//经过的路径入栈
for(int i=0; i<G.vexnum; i++)
{
if((!visit_2[i])&&(G.arcs[start][i]))//如果这个点没有被访问过,而且start与这个点相连,就继续搜索
DFS(G,i,en);
}
visit_2[start]=0;//删除栈顶标记
top--;//删除栈顶元素
}
void print_DFS()
{
if(flag_2==0)
return;
else
{
printf("至多隔着%d位同学:",sum-1);
for(int i=1; i<sum; i++)
{
cout<<mp[arry[i]]<<" ";
}
}
}