zoukankan      html  css  js  c++  java
  • nyoj--973--天下第一(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<string.h>
    #include<queue>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node
    {
    	int v,next;
    	double w;
    }edge[2020];
    int head[2020];
    double dis[2020];
    bool vis[1010];
    int used[1010];
    int m,n,cnt;
    bool SPFA(int sx)
    {
    	queue<int>q;
    	memset(vis,false,sizeof(vis));
    	memset(dis,0,sizeof(dis));
    	memset(used,0,sizeof(used));
    	q.push(sx);
    	vis[sx]=true;
    	used[sx]++;
    	dis[sx]=1.0;
    	while(!q.empty())
    	{
    		int u=q.front();
    		q.pop();
    		vis[u]=false;
    		for(int i=head[u];i!=-1;i=edge[i].next)
    		{
    			int v=edge[i].v;
    			double f=edge[i].w;
    			if(dis[u]*f>dis[v])
    			{
    				dis[v]=dis[u]*f;
    				if(!vis[v])
    				{
    					vis[v]=1;
    					q.push(v);
    					used[v]++;
    					if(used[v]>=n)
    					return true;
    				}
    			}
    		}
    	}
    	return false;
    }
    int main()
    {
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		memset(head,-1,sizeof(head));
    		cnt=0;
    		cin>>n>>m;
    		int x,y;
    		double w;
    		for(int i=0;i<m;i++)
    		{
    			cin>>x>>w>>y;
    			edge[cnt].v=y;
    			edge[cnt].w=w;
    			edge[cnt].next=head[x];
    			head[x]=cnt++;
    		}
    		if(SPFA(1))
    		cout<<"Yes"<<endl;
    		else
    		cout<<"No"<<endl;
    	}
    	return 0;
    }



  • 相关阅读:
    结构体数组
    关于VCL的编写 (一) 如何编写自己的VCL控件
    谈一下怎样设计Oracle 分区表
    c++截取屏幕图片并保存(函数代码实现)
    微信公众平台开发之微团购
    怎么调用系统通讯录并向被选中联系人发送短信
    TFS(Team Foundation Server)介绍和入门
    2014百度之星资格赛题解
    C语言中volatilekeyword的作用
    自己定义滑动开关控件的实现与使用
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273501.html
Copyright © 2011-2022 走看看