poj 2240


ford变种算法,求是否存在正权回路

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <map>
  3. #include <cstring>

  4. using namespace std;

  5. #define MAX_V (30+1)
  6. #define inf (2000000000)
  7. double E[MAX_V][MAX_V];
  8. double D[MAX_V];
  9. map<string,int> M;


  10. int n,m;
  11. int index_v=1;

  12. void solve(int index_v)
  13. {
  14.     int found = 0;
  15.     
  16.     for(int k=1;k<=n;k++)
  17.     {
  18.         if(E[1][k] != 0)
  19.         {
  20.             D[k] = E[1][k];
  21.         }
  22.     }
  23.     for(int i=1;i<=n-1;i++)
  24.     {
  25.         int flag = 0;
  26.         
  27.         //foreach u,v
  28.         for(int j=1;j<=n;j++)
  29.         {
  30.             for(int k=1;k<=n;k++)
  31.             {
  32.                 if(E[j][k] != 0)
  33.                 {
  34.                     //each edge j->k
  35.                     double kw=D[j] * E[j][k];
  36.                     if(kw > D[k])
  37.                     {
  38.                         D[k]= kw;
  39.                         flag=1;
  40.                     }
  41.                 }
  42.             }
  43.         }

  44.         if(!flag)
  45.             break;
  46.     }
  47.     
  48.         //foreach u,v
  49.         for(int j=1;j<=n;j++)
  50.         {
  51.             for(int k=1;k<=n;k++)
  52.             {
  53.                 if(E[j][k] != 0)
  54.                 {
  55.                     //each edge j->k
  56.                     double kw=D[j] * E[j][k];
  57.                     if(kw > D[k])
  58.                     {
  59.                         D[k]= kw;
  60.                         cout<<"Case "<<index_v<<": Yes"<<endl;
  61.                         return;
  62.                     }
  63.                 }
  64.             }
  65.         }

  66.     cout<<"Case "<<index_v<<": No"<<endl;
  67. }
  68. int main()
  69. {
  70.     while(cin>>n)
  71.     {

  72.         if(n == 0)
  73.             break;

  74.         memset(E,0,sizeof(E));
  75.         for(int i=1;i<=n;i++)
  76.         {
  77.             string name;
  78.             cin>>name;

  79.             M[name]=i;
  80.         }

  81.         cin>>m;

  82.         for(int i=1;i<=m;i++)
  83.         {
  84.             string namei,namej;
  85.             double rij;
  86.             int vi,vj;

  87.             cin>>namei>>rij>>namej;

  88.             vi=M[namei];
  89.             vj=M[namej];
  90.             E[vi][vj]=rij;
  91.         }

  92.         solve(index_v);
  93.         index_v++;
  94.     }
  95. }

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(14) | 评论(0) | 转发(0) |
0

上一篇:poj 1125

下一篇:poj 2488

给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值