天下第一---(spfa判环)

来源:互联网 发布:部落冲突疗伤法术数据 编辑:程序博客网 时间:2024/04/30 17:17
描述

AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是“人在江湖漂,怎能

 

不挨刀",人在江湖身不由己",如果自己的武功太差,在江湖会死的很惨,但是AC_Grazy没有

 

武功秘籍练不了绝世武功.有道是“山重水复疑无路,柳暗花明又一村”,AC_Grazy家里面

 

竟然藏着一本书,书名竟然叫做【超级外挂】,竟然能在各种武功之间进行转化,据说是他爷

 

爷的爷爷的...爷爷传下来的...

 

闲着无事便拿来看看,只看一眼便再也停不下了,只见上面写着“纵横武林打遍天下无敌手武功心法秘籍收录”.

 

翻开第一篇一看竟然是【降龙十八掌】...

 

心法只是一个修练武功的途径,重要的是真气的多少,于是他便想利用外挂让武功之间进行转

 

化,来让真气无限增加,但是这个心法只能按照顺序转化,我们分别用 1号和2号来代替两种功法 当然转化会有一定的转化率f

 

比如1 0.5 2 便是把 1的一半真气转化给2 ,为了简化问题,我们每次都从1号秘籍开始进行转化,如果其中一个秘籍转化断了,那么以后的功法就不能转换。

输入
输入:首先输入一个数 T(T<=20)表示T组数据

然后输入两个数n(2<=n<=500)和m(1=<m<=2000)分别表

示有n种秘籍,随后的m行分别输入

秘籍u(n>=u>0) 转化率 f (0<f<=10)秘籍 v.(0<v<=n)
输出
输出:如果可以无限增加真气输出Yes否则输出No.
样例输入
23 31 2 22 2 33 2 14 31 2 23 2 44 2 3
样例输出
Yes

No

当某个顶点进入队列的次数大于它的入度时候 可以判断已经成环。

#include <stdio.h>  #include <algorithm>  #include <string.h>  #include <vector>  #include <queue>  using namespace std;  double f[505][505],dist[505];//f为转换率 dist源点到各点的路径   int n,m,sum[505];//n为点的个数,m为边的个数,sum为进队列的次数   int in_degree[505];//入度  判断是否成环 bool in[505];//判断是否在队列中   vector<int>list[505];//邻接表   queue<int>s;  bool spfa(int pos)  {      while(!s.empty())      s.pop();      sum[pos]++;      in[pos]=true;      dist[pos]=1.0;      s.push(pos);      while(!s.empty())      {          pos=s.front();          s.pop();          in[pos]=false;          for(int i=0;i<list[pos].size();i++)          {              int x=list[pos][i];              if(dist[x]<dist[pos]*f[pos][x])              {                  dist[x]=dist[pos]*f[pos][x];                  if(!in[x])                  {                      s.push(x);                      in[x]=true;                      //已经成环 真气可以无限增加                     if(++sum[x]>in_degree[x])                      return true;                  }              }          }      }      return false;  }  int main()  {      int ncase;      scanf("%d",&ncase);      while(ncase--)      {          memset(f,0,sizeof(f));          memset(list,0,sizeof(list));          memset(in,false,sizeof(in));          memset(sum,0,sizeof(sum));          memset(dist,0,sizeof(dist));memset(in_degree,0,sizeof(in_degree));          scanf("%d %d",&n,&m);          for(int i=0;i<m;i++)          {              int a,b;              double x;              scanf("%d %lf %d",&a,&x,&b);              f[a][b]=max(f[a][b],x); in_degree[b]++; //建邻接表             list[a].push_back(b);          }          if(spfa(1))              printf("Yes\n");          else              printf("No\n");                    }  }   


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 感冒了浑身没劲怎么办 四个月宝宝鼻塞怎么办 四个月小孩鼻塞怎么办 小儿流清水鼻涕怎么办 小孩总是流鼻子怎么办 四个月小孩咳嗽怎么办 儿童流清水鼻涕怎么办 四个月婴儿发烧怎么办 宝宝体温36度怎么办 儿童感冒后鼻塞怎么办 儿童没感冒鼻塞怎么办 宝宝鼻塞怎么办3岁 儿童刚开始感冒鼻塞怎么办 婴儿感冒打喷嚏流鼻涕怎么办 宝宝感冒鼻涕多怎么办 一个多月的宝宝鼻塞怎么办 五个月宝宝鼻塞怎么办 4个月大婴儿鼻塞怎么办 四个月婴儿鼻塞怎么办 鼻炎晚上睡觉鼻塞怎么办 感冒了一直流鼻涕怎么办 感冒了鼻塞严重怎么办 两边鼻子都塞怎么办 感冒睡觉鼻子堵怎么办 孩子鼻炎流清水怎么办 小儿鼻涕流不停怎么办 老是单侧流鼻涕怎么办 有鼻炎光流鼻涕怎么办 一只鼻塞流鼻涕怎么办 鼻子总痒流鼻涕怎么办 鼻子总是痒流鼻涕怎么办 感冒后老流鼻涕怎么办 鼻炎犯了鼻塞怎么办 鼻炎鼻塞鼻涕多怎么办 猪鼻塞怎么办速效办法 感冒难受怎么办小窍门 来月经上火了怎么办 鼻血狂流不止怎么办 十三个月宝宝流鼻血怎么办 单侧鼻子出血怎么办 流鼻血停不下来怎么办