uva11090

来源:互联网 发布:淘宝代购包包是真的吗 编辑:程序博客网 时间:2024/05/17 22:18

模板的威力真大。。

我照着模板写,必要时把int 改为double


然后这道题用二分,,因为有模板 写的时候的衔接度很高。。。一下就能过了。。




#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<string>#include<cstring>#include<iomanip>#include<iostream>#include<stack>#include<cmath>#include<map>#include<vector>#define ll long long#define inf 0x3f3f3f3f#define INF 1e9#define bug1 cout<<"bug1"<<endl;#define bug2 cout<<"bug2"<<endl;#define bug3 cout<<"bug3"<<endl;using namespace std;#define sf scanf#define pf printf#define mem(a,b) memset(a,b,sizeof(a));#define out(a) printf("%d\n",&a);int n,m;const int maxn=1000;struct Edge{    int from,to;    double dist;    Edge(int a,int b,double c){        from=a;to=b;dist=c;    }};struct BellmanFord{    int n,m;    vector<Edge>edges;    vector<int>G[maxn];    bool inq[maxn];    double d[maxn];    int p[maxn];    int cnt[maxn];    void init(int n){        this->n=n;        for(int i=0;i<n;++i)G[i].clear();        edges.clear();    }    void AddEdge(int from,int to,double dist){        edges.push_back((Edge){from,to,dist});        m=edges.size();        G[from].push_back(m-1);    }    bool negativeCycle(){        queue<int>Q;        mem(inq,0);        mem(cnt,0);        for(int i=0;i<n;++i){d[i]=0;inq[0]=true;Q.push(i);}        while(!Q.empty()){            int u=Q.front();Q.pop();            inq[u]=false;            for(int i=0;i<G[u].size();++i){                Edge& e=edges[G[u][i]];                if(d[e.to]>d[u]+e.dist){                    d[e.to]=d[u]+e.dist;                    p[e.to]=G[u][i];                    if(!inq[e.to]){                        Q.push(e.to);inq[e.to]=true;if(++cnt[e.to]>n)return true;                    }                }            }        }        return false;    }};BellmanFord solver;bool test(double x){    for(int i=0;i<solver.m;++i)        solver.edges[i].dist-=x;    bool ret=solver.negativeCycle();    for(int i=0;i<solver.m;++i){        solver.edges[i].dist+=x;    }    return ret;}int main(){    int t;    sf("%d",&t);    int kase=0;    while(t--){        sf("%d%d",&n,&m);        solver.init(n);        int ub=0;        for(int i=1;i<=m;++i){            int u,v,w;            sf("%d%d%d",&u,&v,&w);u--;v--;ub=max(ub,w);            solver.AddEdge(u,v,w);        }        pf("Case #%d: ",++kase);        if(!test(ub+1))pf("No cycle found.\n");        else{            double L=0,R=ub;            while(R-L>1e-3){                double M=L+(R-L)/2;                if(test(M))R=M;                else L=M;            }            pf("%.2lf\n",L);        }    }}

0 0