现在的位置: 首页 > 综合 > 正文

HDU-1869(floyd求任意两点之间的距离)

2013年03月07日 ⁄ 综合 ⁄ 共 2290字 ⁄ 字号 评论关闭

这个题目,我一看到的居然是用DFS,汗了,,,但是我写着写着,还居然给过了样例,和自己的一些特殊数据,,但是到后来我突然就觉得不对了,,因为一出现环数据就过不了了,而我又不想在研究研究求出最小值,但是这个思路还是可行的...但是麻烦,我就不写出来了.

然后floyd算法还是比较简单的.只用个三重循环,然后再来个二重循环就可以整出来了,代码非常好实现,

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int N,M;
int map[205][205];

void Floyd()
{
	for(int k=0;k<=N;k++)
		for(int i=0;i<=N;i++)
			for(int j=0;j<=N;j++)
			if(map[i][j]>map[i][k]+map[k][j]&&map[i][k]!=0x3f3f3f3f&&map[k][j]!=0x3f3f3f3f)
				map[i][j]=map[i][k]+map[k][j];

}
int judge()
{
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			//printf("sta=%d end=%d, step=%d",i,j,map[i][j]);
			//printf("\n");
			if(map[i][j]>7)
			{
				return 0;
			}
		}
	}
	return 1;
}

int main()
{
	while(scanf("%d%d",&N,&M)!=EOF)
	{
		int a,b;
		memset(map,0x3f,sizeof(map));
		for(int kk=0;kk<N;kk++)
			map[kk][kk]=0;
		for(int i=1;i<=M;i++)
		{
			scanf("%d%d",&a,&b);
			map[a][b]=1;
			map[b][a]=1;
		}
		Floyd();
		if(judge())
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

 

 

当然我也想把我的DFS也贴出来 嘿嘿,虽然是错的,但毕竟是一种思路不,,呼呼

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int N,M;//N represents the number of points,and M stands for the number of edges;
int idx;
int head[105];
int step;
int flag;
int visit[105];
struct Edge
{
	int v;
	int next;
}e[205];

void addedge(int a,int b)
{
	idx++;
	e[idx].v=b;
	e[idx].next=head[a];
	head[a]=idx;
}

void DFS(int a,int step)
{
	if(step>6)
	{
		flag=0;
		return;
	}
	for(int p=head[a];p!=-1;p=e[p].next)
	{
		if(flag==1&&!visit[e[p].v])
		{
			visit[e[p].v]=1;
			DFS(e[p].v,step+1);
			visit[e[p].v]=0;
		}

	}
}

int main()
{
	while(scanf("%d%d",&N,&M)!=EOF)
	{
		int a,b;
		int t=-1;
		idx=0;
		memset(head,-1,sizeof(head));
		for(int i=0;i<M;i++)
		{
			scanf("%d%d",&a,&b);
			addedge(a,b);
			addedge(b,a);
		}
		for(i=0;i<N;i++)
		{
			flag=1;
			memset(visit,0,sizeof(visit));
			visit[i]=1;
			DFS(i,-1);
			if(flag==0)
			{
				printf("No\n");
				break;
			}
			visit[i]=0;
		}
		if(t<=6&&flag==1)
			printf("Yes\n");
	}
	return 0;
}


#include <stdio.h>
#include  <string.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#define inf 0x3fffffff
#define inf2 0x3f3f3f3f


using namespace std;

int map[555][555];


int N,M;

void Floyd()
{
	for(int k=1; k <= N; k++)
	{
		for(int i=1; i <= N ; i++ )
		{
			for(int j=1 ;j <= N;j++)
			{
				if(map[i][j]>map[i][k]+map[k][j]&&map[i][k]!=inf2&&map[k][j]!=inf2)
				map[i][j]=map[i][k]+map[k][j];
			}
		}
	}
}



int main()
{
	while(scanf("%d %d" ,&N, &M)!=EOF)
	{
		int a, b;
		int min=inf;
		int val;
		memset(map,0x3f3f3f3f,sizeof(map));
		for(int i=1 ; i<=M ;i++ )
		{
			scanf("%d %d %d " , &a , &b ,&val );
			if(map[a][b]>val)
			{
				map[a][b]=val;
				map[b][a]=val;
			}
		}
		Floyd();
		while(cin >> a >> b)
		{
			cout << map[a][b] << endl;
		}		
	}
	return 0;
}

 

抱歉!评论已关闭.