另一种实现方式:#include <stack> #include <vector> #include <iostream> using namespace std; vector<int>node[10001]; void creat(int m) { int i; int a,b; for(i=0;i<m;i++) { cin>>a>>b; node[a].push_back(b); node[b].push_back(a); } } void serch(int a ) { if(node[a].size()==0) { cout<<"0"<<endl; return ; } int tn,ln; bool st=0,st1=0; int result1=0; int result=0; bool pass[10001]={0}; bool step=0; stack<int>head[2]; head[step].push(a); while(1) { if(head[step].empty()) break; while (!head[step].empty())//遍历桶中元素 { tn=head[step].top();//从桶中取出一个元素 head[step].pop();//弹出 result1=result; st1=st; result=tn; st=step; pass[tn]=1;//标记为已访问 for(int i=0;i<node[tn].size();i++)//遍历取出得元素的邻接节点 { ln=node[tn][i]; if(pass[ln]==1) continue; head[!step].push(ln); } } step=!step; } if(st==st1) result=result>result1?result1:result; cout<<result<<endl; } int main() { int t; int n,m,k; cin>>n>>m>>k; creat(m); for(int i=0;i<k;i++) { cin>>t; serch(t); } return 0; }
#include <iostream>#include <cstdio>#include <vector>#include <queue>#include <cstring>using namespace std;int vis[10001];vector<int> c[10005];typedef pair<int,int>P;queue<P> que;int bfs(int t){ int x,y,ans,ani; que.push(P(t,0)); ans=0; ani=t; vis[t]=1; while(!que.empty()) { P tmp=que.front(); x=tmp.first; y=tmp.second; que.pop(); if(ans==y) { ani=min(ani,x); } if(ans<y) { ans=y; ani=x; } for(int i=0;i<c[x].size();i++) { if(!vis[c[x][i]]) { que.push(P(c[x][i],y+1)); vis[c[x][i]]=1; } } } if(ans==0) { return 0; } return ani;}int main(){ int n,m,k,i,j,a,b; scanf("%d %d %d",&n,&m,&k); for(i=0;i<m;i++) { scanf("%d %d",&a,&b); c[a].push_back(b); c[b].push_back(a); } for(i=0;i<k;i++) { scanf("%d",&a); memset(vis,0,sizeof(vis)); printf("%d\n",bfs(a)); } return 0;}
天梯赛喊山
最新推荐文章于 2021-04-20 23:58:49 发布