正文

Floyd算法应用2006-07-27 20:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tonyhu/16884.html

分享到:

Floyd算法的变化应用:

       大家应该都知道Floyd在图中的任意两点最短路径的算法中的应用吧。现在我们来看一个Floyd在其它方面的应用……

题目:

Sorting It All Outzju1060

问题描述:

       若变量 A, B, C, D已排好序,意味着: A < B, B < C,C < D. 本问题中,将给出一组变量间的小于关系,请你判断它们是否能确定一个排好的序列。

输入:

4 6         //变量有4个(大写字母A—xx),下面紧跟6种关系
A<B
A<C
B<C
C<D
B<D
A<B
3 2         //又一TEST
A<B
B<A
26 1
A<Z
0 0         //00结束

输出:

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

说明:

第一组:前4个关系式就能确定序列

第二组:前两个关系式中出现矛盾

第三组:不能确定

问题分析:

    n个元素要是能确定一个全序,任意两个元素间必能比较大小,这样关系总数应该有n-1 + n-2 + n-3 + +1 = n*(n-1)/2 个。

    当关系式能产生n*(n-1)/2 个关系时,序列可确定。(直接排序)

    由于关系只有小于,我们可以用邻接矩阵来表示元素之间的小于关系。

    d[i][j]=d[j][i]d[i][j]=1时,­(就是不能A<BB<A)出现矛盾

   

    当关系式不能产生n*(n-1)/2 个关系,也未出现矛盾,则序列不能确定。

    现在可以确定对图的操作:由传递性把关系补充完全。然后判断矛盾;若无矛盾,统计邻接矩阵内1的个数。

    使用算法: Floyd算法

//计算传递性

             for(x=0;x<n;x++)

                        for(y=0;y<n;y++)

                              for(z=0;z<n;z++)

                                    if(relation[y][x]&&relation[x][z])

                                          relation[y][z]=1;  //不计算最短路径

源程序如下:

#include <iostream>
#include <algorithm>
using namespace std;

int relation[26][26];  //关系邻接矩阵
char data[26];   //存储N个字母

int change(char a)  //把大写字母变成矩阵中的序号
{
 return a-65;
}

void Sort(int n)   //成功时对字母的排序输出
{ int i;
for( i=0;i<n;i++)
data[i]='A'+i;
sort(data,data+n);
for(i=0;i<n;i++)
cout<<data[i];
cout<<endl;
}
int main()
{
 int n,m,flag,F,x,y,z,i,count,T,U;
 char tx,tt,ty;
 cin>>n>>m;
 do      //整个大循环,遇00时结束程序
 {
  T=U=0;
  if(n==0&&m==0)
   break;
  memset(relation,0,sizeof(relation));
  flag=F=0;
  for(i=0;i<m;i++)  //m个关系,每读入一对关系都要操作,因为要计算所用的关系数
  {
   cin>>tx>>tt>>ty;
   if(flag||F)   //flag 为冲突标志 ;F为已经满足的标志
    continue;
   relation[change(tx)][change(ty)]=1;
   for(x=0;x<n;x++)    //Floyd计算传递性
    for(y=0;y<n;y++)
     for(z=0;z<n;z++)
      if(relation[y][x]&&relation[x][z])
       relation[y][z]=1;
   count=0;
   for(x=0;x<n;x++)  
   { for(y=0;y<n;y++)
   {
    if(relation[x][y]&&relation[y][x])  //检验冲突
    {
     U=i+1;      //记录检验到冲突时已经检验的关系数
     flag=1;  break;
    }
    else if(relation[x][y]||relation[x][y])
     count++;
   }  //for
   if(flag) break;
   }  //for
   if(flag) continue;
   if(count==n*(n-1)/2)
   {
    T=i+1;   //记录满足条件时的检验的关系数
    F=1;
   }
  } //for
  if(U)
  {
   cout<<"Inconsistency found after "
    <<U<<" relations.\n";
   goto next;   //进入大循环
  }
  else if(count!=n*(n-1)/2)
  {
   cout<<"Sorted sequence cannot be determined.\n";
   goto next;
  }
  cout<<"Sorted sequence determined after "
   <<T<<" relations: ";
  Sort(n);
next:  cin>>n>>m;
 }while(1);
}

阅读(8370) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册