hdu 1869 六度分离(SPFA算法)
2015-08-19 21:24
344 查看
本题链接:点击打开链接
本题大意:
输入n,m,代表有n个点,m条边;然后输入m个点,让证明“六度分离”的正确性,不妨设每条边的权值为1,则只需求任意两个人的最短距离是不是满足要求即可。因为最多隔六个人,故两人间的距离只要小于7就满足。具体请参考代码:
本题大意:
输入n,m,代表有n个点,m条边;然后输入m个点,让证明“六度分离”的正确性,不妨设每条边的权值为1,则只需求任意两个人的最短距离是不是满足要求即可。因为最多隔六个人,故两人间的距离只要小于7就满足。具体请参考代码:
#include<stdio.h> #include<string.h> #include<queue> #define MAXN 110 #define MAXM 420 #define INF 0x3f3f3f3f using namespace std; int head[MAXN]; int mark[MAXN]; int dis[MAXN]; struct node{ int from,to,val,next; }; node edge[MAXM]; int n,m,num; void getmap(int u,int v) { node e={u,v,1,head[u]}; edge[num]=e; head[u]=num++; } void SPFA(int s) { queue<int>q; memset(mark,0,sizeof(mark)); memset(dis,INF,sizeof(dis)); q.push(s); mark[s]=1; dis[s]=0; while(!q.empty()) { int top=q.front(); q.pop(); mark[top]=0; for(int i=head[top];i!=-1;i=edge[i].next) { int u=edge[i].to; if(dis[u]>dis[top]+edge[i].val) { dis[u]=dis[top]+edge[i].val; if(!mark[u]) { mark[u]=1; q.push(u); } } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { num=0; int flag=0; memset(head,-1,sizeof(head)); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); getmap(a,b); getmap(b,a); } for(int i=0;i<n;i++) { SPFA(i); for(int j=0;j<n;j++) { if(dis[j]>7) { flag=1; break; } } } if(flag) printf("No\n"); else printf("Yes\n"); } return 0; }
相关文章推荐
- HBase Default Configuration
- cvc-complex-type.2.4.a错误解决方法
- hdu2833(Floyd)
- NotePad++中JSLint的使用
- 字符串hash函数
- 归并排序 自顶向下实现
- [转]使用 Vagrant 打造跨平台开发环境
- HDU 1264 Counting Squares(哈希表||离散化)
- hdoj 1969 Pie
- 小比赛(CodeForces 560A,UVA 11040,CodeForces 550B,HDU 1856,UVA 1644,CodeForces 560B,HDU 3405,UVA 10820)
- java 设计类时考虑多线程安全
- Myeclipse 10 破解说明
- 使用VS2010连接MySQL
- 数据持久化 将数据写入到本地 文件管理
- USB引脚定义以及导线的颜色定义
- ACM 概率&&动态规划
- 四校联赛
- PHP:echo print var_dump()和print_r()的区别
- System.getProperty("user.dir"); 获得系统属性
- MyBatis 关联查询