只能说我被一个小错搞得好心痛,本一写好代码感觉写的还优美,但一个小的不能再小的 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); }