zoukankan      html  css  js  c++  java
  • poj 最优比率环

    只能说我被一个小错搞得好心痛,本一写好代码感觉写的还优美,但一个小的不能再小的 i 写出u ,害的我正正调了一天。还不的不与别人对比看。OMG!!

    具体的分析找别人的吧,说的比我好,要吃个苹果放松下

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #define maxn 1005
    using namespace std;
    
    const int INF = 0x3f3f3f;
    
    double mid;
    struct Edge{
    	int from,to;
    	int fun,cost;
    	double dis;
    	int next;
    	void assign(int a,int b,int c,int d,int e){
    		from = a; to = b; cost = c; fun = d;  next = e; //printf("%d %d %d %d \n",from,to,cost,fun);
    	}
    	void update(double k){
    		dis = -(fun - k * cost);
    	}
    	/*
    	void print(){
    		printf("%d %d %d %d %.2lf\n",from,to,cost,fun,dis);
    	}*/	
    }edge[5*maxn]; 
    int F[maxn];
    int n,m;
    int head[maxn];
    int pv = 1;
    
    
    void Addedge(int a,int b,int c,int d){
    	int e = head[a];
    	head[a] = pv;
    	edge[pv++].assign(a,b,c,d,e);
    }
    bool SPFA(){
    	int cnt[maxn];
    	bool inq[maxn];
    	double d[maxn];
    	memset(cnt,0,sizeof(cnt));
    	memset(inq,0,sizeof(inq));
    	for(int i=1;i<=n;i++) d[i] = INF;                                             
    	queue<int> Q;
    	while(!Q.empty()) Q.pop();
        Q.push(1);
    	inq[1] = true; 
    	d[1] = 0;
    	while(!Q.empty()){
    	    int u = Q.front(); Q.pop(); inq[u] = false; 
    		for(int i=head[u];i != -1;i=edge[i].next){
    			int v = edge[i].to;             
    			if(d[v] > d[u] + edge[i].dis){
    				d[v] = d[u] + edge[i].dis;  
    				if(!inq[v]){
    					Q.push(v); inq[v] = true;
    					if(++cnt[v] >= n)  return true;
    				}
    			}
    			
    		}
    	}
    	return false;
    }
    int main()
    {
    	//if(freopen("input.txt","r",stdin)== NULL)  {printf("Error\n"); exit(0);}
    	//if(freopen("output1.txt","w",stdout)== NULL)  {printf("Error\n"); exit(0);}
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>F[i];
    	memset(head,-1,sizeof(head));
    	for(int i=1;i<=m;i++){
    		int a,b,c,d;
    		cin>>a>>b>>c;
    		d = F[b];  
    		Addedge(a,b,c,d);
    	}
    	 
    	double R=10000.0,L=0.0,ans = -1;
    	while((R-L) > 1e-5){
    		mid = (R + L)/2;  
    		for(int i=1;i<=m;i++){
    			edge[i].update(mid); //edge[i].print();
    		}
    		if(SPFA())  { ans = mid; L = mid;  }
    		else         R = mid;
    	}
    	if(ans <= 0 ) printf("0\n");
     	else          printf("%.2lf\n",L);
    }
    

      

  • 相关阅读:
    Java虚拟机--编译那点事儿
    Java虚拟机--常用Java命令(二)
    Java虚拟机--常用Java命令(一)
    Java虚拟机--类加载机制
    Java虚拟机--JIT编译器
    Java虚拟机--垃圾回收机制
    Java虚拟机--对象模型
    Junit测试--多个测试接口如何产生业务联系
    Java虚拟机--内存模型
    Java虚拟机--内存结构
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3095325.html
Copyright © 2011-2022 走看看