码迷,mamicode.com
首页 > 其他好文 > 详细

UVA11090 Going in Cycle!!

时间:2018-11-08 21:59:13      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:color   ack   0.00   size   set   div   struct   max   一个   

给定一个N个点M条边的带权有向图,求平均值最小的回路

二分查找+bellmanford判负环

 1 #include<cstdio>
 2 #include<vector>
 3 #include<cstring>
 4 #include<queue>
 5 const int maxn=10000;
 6 using namespace std;
 7 struct Edge{
 8     int from,to;
 9     double dist;
10 };
11 struct bellmanford{
12     int n,m;
13     vector<Edge> edges;
14     vector<int> G[maxn];
15     bool inq[maxn];
16     double d[maxn];
17     int p[maxn];
18     int cnt[maxn];
19     
20     void init(int n){
21         this->n=n;
22         for(int i=0;i<n;++i) G[i].clear();
23         edges.clear();
24     }
25     
26     void addedges(int from,int to,int dist)
27     {
28         edges.push_back((Edge){from,to,dist});
29         m=edges.size();
30         G[from].push_back(m-1);
31     }
32     
33     bool negativecycle(){
34         queue<int> Q;
35         memset(inq,0,sizeof(inq));
36         memset(cnt,0,sizeof(cnt));
37         for(int i=0;i<n;++i) {d[i]=0;inq[0]=true;Q.push(i);}
38         while(!Q.empty())
39         {
40             int u=Q.front();Q.pop();
41             inq[u]=false;
42             for(int i=0;i<G[u].size();i++)
43             {
44                 Edge& e=edges[G[u][i]];
45                 if(d[e.to]>d[u]+e.dist)
46                 {
47                     d[e.to]=d[u]+e.dist;
48                     p[e.to]=G[u][i];
49                     if(!inq[e.to]) 
50                     {
51                         Q.push(e.to);inq[e.to]=true;if(++cnt[e.to]>n) return true;
52                     }
53                 }
54             }
55         }
56         return false;
57     }
58 };
59 bellmanford solver;
60 int test(double s)
61 {
62     for(int i=0;i<solver.m;++i) solver.edges[i].dist-=s;
63     bool ret=solver.negativecycle();
64     for(int i=0;i<solver.m;++i) solver.edges[i].dist+=s;
65     return ret;
66 }
67 int main()
68 {
69     int t;
70     scanf("%d",&t);
71     for(int kase=1;kase<=t;kase++)
72     {
73         int n,m,ub;
74         scanf("%d%d",&n,&m);
75         solver.init(n);
76         int zui=0;
77         while(m--)
78         {
79             int u,v,w;
80             scanf("%d%d%d",&u,&v,&w);
81             u--;v--;ub=max(ub,w);
82             solver.addedges(u,v,w);
83         }
84         printf("Case #%d: ",kase);
85         if(!test(ub+1)) printf("No cycle found.\n");
86         else{
87             double l=0,r=ub;
88             while(r-l>0.0001)
89             {
90                 double m=(r+l)/2;
91                 if(test(m)) r=m;else l=m;
92             }
93             printf("%.2lf\n",l);
94         }
95     }
96     return 0;
97 }

 

UVA11090 Going in Cycle!!

标签:color   ack   0.00   size   set   div   struct   max   一个   

原文地址:https://www.cnblogs.com/zytwan/p/9931945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!