floyd两题:POJ1125 Stockbroker Grapevine 和VIJOS P1046 观光旅游

两道floyd的简单题目。最近才学,写起来有点生硬。

POJ1125先算出最短路径然后找最佳人选和最短时间。

#include
const int inf=20;
int n,dis[101][101];
void floyd()
{
	int i,j,k;
	for(k=1;k<=n;k++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				if(i!=j&&dis[i][j]>dis[i][k]+dis[k][j])
					dis[i][j]=dis[i][k]+dis[k][j];
	int maxlen,min=inf,flag;
    for(i=1;i<=n;i++)
    {
        maxlen=0;
        for(j=1;j<=n;j++)
            if(i!=j&&maxlenmaxlen)
        {
            min=maxlen;
            flag=i;
        }
    }
    if(min

之后是用floyd求最小环。这题不要求过所有的景点。。一开始不审题想多了。。。

主要利用到的原理是当处理到k时,所有以1 到k - 1为中间结点的最短路径都已经确定,则这时候的环为(i到j(1 < i, j <= k - 1)的最短路径) + 边(i, k) + 边(k, j)遍历所有的i, j找到上述式子的最小值即位k下的最小代价环(这原理摘自http://blog.csdn.net/youngyangyang04/article/details/7054931,学习了)


#include
#include
#define ll long long
const ll INF=1<<15;
ll ans;
int dis[101][101],m[101][101];
void floyd(int n)
{
	int i,j,k;
	ans=INF;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			m[i][j]=dis[i][j];
	for(k=1;k<=n;k++)
	{
		for(i=1;i




你可能感兴趣的:(图论)