可以用广搜,也可以用最短路来求,我用了最短路
用了Dijkstra+优先队列,15ms就过了,第一次用优先队列优化Dijkstra算法大概时间复杂度就m*log(n)左右
15ms代码
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
const int INF = 1<<26;
using namespace std;
typedef struct node
{
int next,d;
node(){}
node(int a,int b){next=a;d=b;}
bool operator<(const node &a) const
{
if(d==a.d) return next<a.next;
else return d>a.d;
}
}node;
int dis[102],n,m;
vector<node>eg[102];
void Dijkstra(int s)
{
int i,j;
priority_queue<node> q;
for(i=0;i<n;i++) dis[i]=INF;
dis[s]=0;
q.push(node(s,dis[s]));
while(!q.empty())
{
node x=q.top(); q.pop();
for(i=0;i<eg[x.next].size();i++)
{
node y=eg[x.next][i];
if(dis[y.next]>x.d+y.d)
{
dis[y.next]=x.d+y.d;
q.push(node(y.next,dis[y.next]));
}
}
}
}
int main()
{
int i,j,x,y,flag;
while(scanf("%d %d",&n,&m)!=EOF)
{
flag=1;
for(i=0;i<n;i++) eg[i].clear();
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
eg[x].push_back(node(y,1));
eg[y].push_back(node(x,1));
}
for(i=0;i<n;i++)
{
Dijkstra(i);
for(j=0;j<n;j++)
{
if(dis[j]>7)
{
flag=0;
break;
}
}
if(flag==0) break;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}