NYOJ 973 天下第一

题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=973

算法分析:

spfa+负环判定

在传功的过程中如果因为f<1导致逐渐变小,那么即可以负环判定

#include <iostream>
#include<cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
using namespace std;

const int MAXN=505;
const int INF=0x7FFFFFFF;

struct edge
{
    int to;
	double weight;
};

vector<edge> adjmap[MAXN];//邻接表
bool in_queue[MAXN];//顶点是否在队列中
int in_sum[MAXN];//顶点入队次数
double dist[MAXN];//源点到各点的最短路径
int nodesum;//顶点数
int edgesum;//边数

bool SPFA(int source)
{
    queue<int> dq;
    int i,j,x,to;
    for(i=1;i<=nodesum;i++)
    {
        in_sum[i]=0;
        in_queue[i]=false;
        dist[i]=0;
    }
    dq.push(source);
    in_sum[source]++;
    dist[source]=1.0;
    in_queue[source]=true;

    while(!dq.empty())
    {
        x=dq.front();
        dq.pop();
        in_queue[x]=false;
        for(i=0;i<adjmap[x].size();i++)
        {
        	double f=adjmap[x][i].weight;
            to=adjmap[x][i].to;
            if(dist[to]-dist[x]*f<0.01)
            {
                dist[to]=dist[x]*f;
                if(!in_queue[to])
                {
                	dq.push(to);
                    in_queue[to]=true;
                    if(++in_sum[to]>=nodesum) return true;

                }
            }
        }
    }
    return false;
}

int main()
{
    int n,i,s,e;
	double w;
    scanf("%d",&n);
    while(n--){
    edge temp;
    scanf("%d%d",&nodesum,&edgesum);
    for(i=1;i<=nodesum;i++)
    adjmap[i].clear();//清空邻接表
    for(i=1;i<=edgesum;i++)
    {
        scanf("%d%lf%d",&s,&w,&e);
        temp.to=e;
        temp.weight=w;
        adjmap[s].push_back(temp);
    }
	if(SPFA(1))
    cout<<"Yes"<<endl;
	else
	cout<<"No"<<endl;
	}
    return 0;
}
时间: 2024-10-24 20:02:03

NYOJ 973 天下第一的相关文章

NYOJ 973 天下第一(最长路判环)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=973 题目大意:给你n种武功,每两种武功都可以相互转化,但是有转化率f, 每次必须从一开始转化, 中间有武功转化不了, 后面的就不能在转化了, 问你能否可以无限增加转化. 在做这道题以前做了和这道题一样的一道题, 所以我认为很快就能AC了, 但是这道题我还是弄了一天还是没能AC.来讲一下让我很是郁闷的问题吧. 这道题可以用最短路判环(spfa只需稍微变一下)来做,也可以用直接深搜来做.我

NYIST 973 天下第一

天下第一时间限制:1000 ms | 内存限制:65535 KB难度:3 描述AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是“人在江湖漂,怎能 不挨刀",”人在江湖身不由己",如果自己的武功太差,在江湖会死的很惨,但是AC_Grazy没有 武功秘籍练不了绝世武功.有道是“山重水复疑无路,柳暗花明又一村”,在AC_Grazy家里面 竟然藏着一本书,书名竟然叫做[超级外挂],竟然能在各种武功之间进行转化,据说是他爷 爷的爷爷的...爷爷传下来的... 闲着无事便拿来

nyoj 天下第一 (spfa)

要求路径长度大于一,判断出环即可结束.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<queue> 7 #include<algorithm> 8 #include<map> 9 #include<iomanip> 10 #i

nyoj973 天下第一(spfa判环)

题目973 题目信息 运行结果 本题排行 讨论区 天下第一 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是"人在江湖漂,怎能 不挨刀","人在江湖身不由己",如果自己的武功太差,在江湖会死的很惨,但是AC_Grazy没有 武功秘籍练不了绝世武功.有道是"山重水复疑无路,柳暗花明又一村",在AC_Grazy家里面 竟然藏着一本书,书名竟然叫做[超级

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

NYOJ 49 开心的小明

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10

NYOJ 289 苹果

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为: