标签:des blog io ar os sp for div on
Description
Input
Output
Sample Input
Sample Output
#include <cstdio> #include <cstdlib> #include <iostream> #include <cstring> using namespace std; const int maxn=15000; const int maxe=102000; typedef pair<double,double> PP; struct edge { double cc; int to,next; } P[maxe]; int head[maxn],si; PP thing[maxn]; int nn; int c[maxn],topo[maxn],t; //about topo double dp[maxn]; void add_edge(int s,int t,double cc) { P[si].to=t; P[si].cc=cc; P[si].next=head[s]; head[s]=si++; } bool dfs(int u) { c[u]=-1; for(int i=head[u];i!=-1;i=P[i].next){ int v=P[i].to; if(c[v]<0) return false; else if(!c[v]&&!dfs(v)) return false; } c[u]=1; topo[--t]=u; return true; } bool toposort() { t=nn; memset(c,0,sizeof(c)); for(int i=0;i<nn;i++){ if(!c[i]) if(!dfs(i)) return false; } return true; } void Dp(int u) { if(dp[u]!=0.0) return ; dp[u]=thing[u].first; for(int i=head[u];i!=-1;i=P[i].next){ int v=P[i].to; Dp(v); dp[u]=max(dp[u],dp[v]*P[i].cc); } } int main() { int mm,kk,s,t; double cc,ans; while(scanf("%d",&nn),nn!=0){ memset(head,-1,sizeof(head)); si=0; for(int i=0;i<nn;i++) scanf("%lf%lf",&thing[i].first,&thing[i].second); scanf("%d",&mm); while(mm--){ scanf("%d",&kk); kk--; scanf("%d",&s); s--; for(int i=0;i<kk;i++){ scanf("%lf%d",&cc,&t); add_edge(s,--t,cc); s=t; } } toposort(); for(int i=0;i<=nn;i++) dp[i]=0.0; for(int i=0;i<nn;i++){ if(dp[topo[i]]==0.0) Dp(topo[i]); } ans=0; for(int i=0;i<nn;i++) ans+=thing[i].second*dp[i]; printf("%.2f\n",ans); } return 0; }
hdu 3696 10 福州 现场 G - Farm Game
标签:des blog io ar os sp for div on
原文地址:http://www.cnblogs.com/xuesu/p/4087960.html