hdu 1869 六度分离(SPFA算法)

来源:互联网 发布:软件外包公司好不好 编辑:程序博客网 时间:2024/05/18 01:41

本题链接:点击打开链接

本题大意:

        输入n,m,代表有n个点,m条边;然后输入m个点,让证明“六度分离”的正确性,不妨设每条边的权值为1,则只需求任意两个人的最短距离是不是满足要求即可。因为最多隔六个人,故两人间的距离只要小于7就满足。具体请参考代码:

#include<stdio.h>#include<string.h>#include<queue>#define MAXN 110#define MAXM 420#define INF 0x3f3f3f3fusing 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");elseprintf("Yes\n");}return 0;}


 

0 0
原创粉丝点击