nyoj973 天下第一(spfa判环)
Posted 甄情
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj973 天下第一(spfa判环)相关的知识,希望对你有一定的参考价值。
天下第一
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
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.
- 样例输入
-
2 3 3 1 2 2 2 2 3 3 2 1 4 3 1 2 2 3 2 4 4 2 3
- 样例输出
-
Yes No
- 上传者
- ACM_王亚龙
以前做过一次 不过那时候不够深刻了解判断成环的原理
今天仔细又看了一遍 当某个顶点进入队列的次数大于它的入度时候 可以判断已经成环
#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"); } }
以上是关于nyoj973 天下第一(spfa判环)的主要内容,如果未能解决你的问题,请参考以下文章