Dijkstra算法
http://acm.hdu.edu.cn/showproblem.php?pid=1869
本题中每个节点到其他节点的最短路径长度都要判断
即要以每个节点为源点进行判断。
并且可以证明只以一个节点为源点进行判断有特殊数据无法处理
<span style="color:#333333;">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
#define N 105
int map[N][N];//存放a,b之间的关系,及权值
int dist[N];
//标记s(已找到最短路径的节点) 的最短路径长度,和T(未找到最短路径的节点)目前的最短路径
int s[N];//存放已经找到最短路径的节点
int Dijkstra(int v0,int n)
{
int i,j;
int lap=0;//用于标记来判断六度分离是否成立
int temp;
int u;//标记新找到最短路径的节点
memset(s,0,sizeof(s));
for(i=0;i<n;i++)//初始化数据
{
dist[i]=map[v0][i];
}
dist[v0]=0;
s[v0]=1;//把v0加入
u=v0;//标记v0
for(i=1;i<n;i++)//n-1次将剩余节点加入
{
temp=MAX+1;
for(j=0;j<n;j++)//选择最短路径
{
if(!s[j]&&dist[j]<temp)
{
u=j;
temp=dist[j];
}
}
s[u]=1; //将u节点加入s中,此时dist[u]为源点到u的最短路径
if(dist[u]>7) //判断最短路径是否大于7,即判断是否超过8个人相连
{
lap=1;
//printf("lap=%d\n",lap);
break;
}
for(j=0;j<n;j++)
{
//从源点到j的值如果大于以u为中间点的路径长度,则更新dist[j]
if(!s[j]&&map[u][j]+dist[u]<dist[j])
{
dist[j]=dist[u]+map[u][j];
}
}
}
return lap;
}
int main()
{
int n,m;//n为人数0--n,m为数据组数
int a,b;//a,b认识
int i,j;
int lap;
while(~scanf("%d%d",&n,&m))
{
memset(map,MAX,sizeof(map));
while(m--)
{
scanf("%d%d",&a,&b);
//a,b认识,证明a,b之间距离为1
if(a!=b)
map[a][b]=map[b][a]=1;
}
for(i=0;i<n;i++)//将所有节点作为源点找出最短路径
{
lap=Dijkstra(i,n);//迪杰斯特拉算法
if(lap)
break;
}
if(lap)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
</span>