UVA - 11090 Going in Cycle!!

题意:

  给一个有向图,问这个图构成的所有的环中,平均权值最小是多少?

  平均权值是,回路上权值和除以边数。

分析:

  二分答案,让每条边减去二分的值,然后用Bellman-Ford算法,判断负环即可。

坑点:

  如果判断出队次数,则要看是否大于n次,如果判断入队次数,则要看是否大于等于n次。

代码:

 

 

  1 #include<iostream>
  2 using namespace std;
  3 #include<cstdio>
  4 #include<cmath>
  5 #include<vector>
  6 #include<cstring>
  7 #include<queue>
  8 #define MAXN 500
  9 typedef long long LL;
 10 int ii=0;
 11 struct teamdata{
 12     double d;int point;
 13     bool operator<(const teamdata& pt)const{
 14         return this->d>pt.d;
 15     }
 16 };
 17 struct bian{
 18     int point;
 19     double d;
 20 };
 21 int n,m,k,l,s,t;
 22 vector<bian> maps[MAXN];
 23 const double inf=1e10;
 24 double d[MAXN];
 25 int pre[MAXN];
 26 priority_queue<teamdata> team;
 27 int v[MAXN];
 28 int SPFA(double mid){
 29     LL ans=-1;
 30     teamdata pt;
 31     while(!team.empty()) team.pop();
 32     teamdata pd;
 33     for (int i=0;i<=MAXN-1;i++) d[i]=inf,pre[i]=0,v[i]=0;d[s]=0;
 34     for (int i=1;i<=n;i++) {
 35         pt.d=0;pt.point=i;team.push(pt);d[i]=0;v[i]=1;
 36     }
 37     while(!team.empty()){
 38         pt=team.top();team.pop();
 39         //cout<<"*"<<pt.point<<" "<<pt.d<<endl;
 40         v[pt.point]=0;
 41         for (int i=0;i<maps[pt.point].size();i++){
 42             int nb=maps[pt.point][i].point;
 43             if (d[nb]>d[pt.point]+maps[pt.point][i].d-mid){
 44                 d[nb]=d[pt.point]+maps[pt.point][i].d-mid;
 45                 pd.d=d[nb];pd.point=nb;
 46                 if (v[nb]==0){
 47                     v[nb]=1;
 48                 //printf("\t%d %lf %lf\n",pd.point,pd.d,mid);
 49                     team.push(pd);
 50         pre[nb]++;
 51         if (pre[nb]>=n) {
 52        return 1;
 53         }
 54                 }
 55         }
 56         }
 57     }
 58     return 0;
 59 }
 60 void deal(){
 61     scanf("%d%d",&n,&m);
 62     double w;
 63     for (int i=0;i<=n;i++) maps[i].clear();
 64     double ll=0;
 65     for (int i=1;i<=m;i++){
 66         int l,r;
 67         scanf("%d%d%lf",&l,&r,&w);
 68         bian pt;pt.d=w;pt.point=r;
 69         ll=max(ll,w);
 70         maps[l].push_back(pt);
 71     }
 72     double l,r,mid,ans=1e9;
 73     l=0;r=ll+1;
 74     if (SPFA(ll+1)==0){
 75         printf("No cycle found.\n");
 76         return;
 77     }
 78     else
 79         while((r-l)>1e-10){
 80         mid=(l+r)/2;
 81         int zans=0;
 82         zans=SPFA(mid);
 83         if (zans){
 84             if (mid<ans) ans=mid;
 85             r=mid;
 86         }else{
 87             l=mid;
 88         }
 89         }
 90     printf("%.2lf\n",ans);
 91 }
 92 int main(){
 93     int t;
 94     scanf("%d",&t);
 95     while(t--){
 96         ii++;
 97         printf("Case #%d: ",ii);
 98         deal();
 99     }
100     return 0;
101 }

 

转载于:https://www.cnblogs.com/xfww/p/7625650.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值