poj1860(spfa)


两种情况YES,一种是存在正权回路;
       一种是求最长路后,实现了增值,也是YES;
用spfa来判断是否存在正权回路,其实spfa是可以用来判断是否存在回路的,不管是正权还是负权,只不过它们松弛的条件不同,正权的话,我们是往dis[]权值增大的方向松弛,负权的话,我们是往dis[]权值减少的方向松弛,然后判断是否存在回路只要看有没有一点入队列的次数大于n就行了用spfa来判断是否存在正权回路,其实spfa是可以用来判断是否存在回路的,不管是正权还是负权,只不过它们松弛的条件不同,正权的话,我们是往dis[]权值增大的
 
如果存在一个环(从某个点出发又回到自己的路径),而且这个环上所有权值之和是负数,那这就是一个负权环,也叫负权回路;同理正权回路;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <queue>
#include <algorithm>
using namespace std;
#define N 210
#define INF 0xfffffff
double dist[N], V;
int cnt, Head[N], num[N], vis[N];
int n, m, s;

struct Edge
{
    int v, next;
    double r, c;
}e[N];

void Add(int u, int v, double r, double c)
{
    e[cnt].v = v;
    e[cnt].r = r;
    e[cnt].c = c;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
}
//spfa模板
/*int spfa(int src,int n){//用队列实现
int i;
memset(cnt,0,sizeof(cnt));//入队次数
memset(vis,false,sizeof(vis));//
for(i=1;i<=n;i++)dist[i]=INF;
dist[src]=0;
queue<int>Q;
Q.push(src);vis[src]=true;++cnt[src];
while(!Q.empty()){
    int u,v;
    u=Q.front();Q.pop();vis[u]=false;
    for(i=head[u];i!=-1;i=nxt[i]){
        v=pnt[i];
        if(1==relax(u,v,cost[i])&&!vis[v]){
            Q.push(v);vis[v]=true;
            if((++cnt[v])>n)return -1;//cnt[i]为入队列次数,用来判断是否存在负权回路
        }
    }
}
if(dist[n]==INF)return -2;//src和n不可达,有些题目可省
return dist[n];//返回src到n的最短距离,根据题意不同而改变
}
*/
bool spfa()///spfa模板;
{
    memset(vis, 0, sizeof(vis));
    memset(num, 0, sizeof(num));
    queue<int>Q;
    vis[s] = 1;
    dist[s] = V;
    Q.push(s);
    num[s]++;
    while(Q.size())
    {
        int p=Q.front();
        Q.pop();
        vis[p] = 0;
        for(int i=Head[p]; i!=-1; i=e[i].next)
        {
            int q = e[i].v;
            if(dist[q] < (dist[p] - e[i].c) * e[i].r)///注意松弛的变化;
            {
                dist[q] = (dist[p] - e[i].c) * e[i].r;
                if(!vis[q])
                {
                    vis[q] = 1;
                    Q.push(q);
                    num[q] ++;
                    if(num[q]>n)
                        return true;///存在正权回路;
                }
            }
        }

    }
    if(dist[s]>V)///最长路后,实现了增值;
        return true;
    return false;
}

int main()
{
    int a, b;
    double rab, rba, cab, cba;
    while(scanf("%d%d%d%lf", &n, &m, &s, &V)!=EOF)
    {
        cnt = 0;
        memset(Head, -1, sizeof(Head));
        memset(dist, 0, sizeof(dist));
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%lf%lf%lf%lf", &a, &b, &rab, &cab, &rba, &cba);
            Add(a, b, rab, cab);
            Add(b, a, rba, cba);
        }
        if( spfa() )
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}








内容概要:本文档详细介绍了基于Python的在线二手电子产品回收系统的设计与实现。项目旨在通过构建一个可靠、安全、透明的平台,提高废旧电子产品的回收率,推动资源的合理再利用,提供安全可靠的交易平台,加强环保意识,促进二手市场的发展,并实现数据驱动的智能化服务。项目面临的主要挑战包括废旧电子产品的检测与评估、信息不对称与交易风险、市场需求的预测与定价、用户体验优化及平台的安全性与数据保护。解决方案涵盖智能化评估与回收定价、高效的二手产品处理流程、完善的售后保障体系、创新的市场需求分析、全程透明化与安全性保障以及定制化用户体验。系统采用微服务架构,包括用户管理、商品评估、交易管理、数据分析、支付与结算等模块。项目还涉及前端界面设计、API接口开发、数据库设计与实现、模型训练与优化、部署与应用等方面。 适合人群:具备一定编程基础,特别是对Python和Web开发有一定了解的研发人员,以及对二手电子产品回收和环保事业感兴趣的从业者。 使用场景及目标:①帮助用户方便地将闲置电子产品回收、交易或再利用,提高废旧电子产品的回收率;②通过智能化的数据分析为用户提供价格评估、市场需求分析等服务,提高回收效率;③提供安全可靠的交易平台,确保交易的公平性和安全性;④推动二手市场的健康发展,为消费者提供经济实惠的产品选择;⑤增强公众的环保意识,推动社会向绿色、低碳方向发展。 其他说明:本文档不仅提供了系统的功能模块设计、数据库表结构、API接口规范,还展示了具体代码实现和GUI界面设计,为开发者提供了全面的技术参考。此外,项目强调了数据安全和隐私保护的重要性,确保平台在运行过程中能够有效保护用户信息。项目未来改进方向包括增强模型的精准度、拓展国际市场、提供更多支付和融资选项、跨平台数据集成与分析、更加智能的回收流程以及强化社交化与社区功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值