题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869
判断各点间的距离是否超过7,遍历一遍各点间的最短距离便可;
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<29 #define s(a) scanf("%d",&a) #define CL(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=105; int n,m,a,b; int Map[N][N]; bool vis[N]; int dist[N]; int dijkstra(int a) { CL(vis,false); for(int i=1;i<=n;i++) dist[i]=inf; dist[a]=0; while(1){ int v=-1; for(int u=1;u<=n;u++) if(!vis[u]&&(v==-1||dist[u]<dist[v])) v=u; if(v==-1) break; vis[v]=true; for(int u=1;u<=n;u++) dist[u]=min(dist[u],dist[v]+Map[v][u]); } for(int i=1;i<=n;i++) if(dist[i]>7) return 0; return 1; } int main() { while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) Map[i][j]=Map[j][i]=inf; Map[i][i]=0; } for(int i=0;i<m;i++){ scanf("%d%d",&a,&b);a++,b++; Map[a][b]=Map[b][a]=1; } int i; for(i=1;i<=n;i++){ if(dijkstra(i)==0) break; } if(i<=n) printf("No\n"); else printf("Yes\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 01:54:14