如果代码77行用cin>>k;输入k值,会爆零
但使用scanf("%lf",&k);就没有问题
请问是什么原因?
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int const X=1e5+100;
int n,u,v;
double k;
vector<int> e[X];
int in[X],c[X],cnt_c;
bool p[X];
void find(int u,int father){
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(v==father || p[v]) continue;
if(in[v]==2){
p[v]=1;
c[++cnt_c]=v;
find(v,u);
break;
}
}
return ;
}
void topo(){
queue<int> q;
for(int i=1;i<=n;i++){
if(in[i]==1) q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
in[v]--;
if(in[v]==1) q.push(v);
}
}
for(int i=1;i<=n;i++){
if(in[i]==2){
p[i]=1;
c[++cnt_c]=i;
find(i,-1);
break ;
}
}
return ;
}
int f[X][2],w[X];
void dfs(int u,int father){
f[u][1]=w[u]; f[u][0]=0;
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(v==father || p[v]) continue;
dfs(v,u);
f[u][1]+=f[v][0];
f[u][0]+=max(f[v][0],f[v][1]);
}
return ;
}
int g[X][2],ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
n=rd();
for(int i=1;i<=n;i++) w[i]=rd();
for(int i=1;i<=n;i++){
u=rd(); v=rd();
u++;v++;
in[u]++; in[v]++;
e[u].push_back(v);
e[v].push_back(u);
}
scanf("%lf",&k);//cin>>k; //会全部WA
topo();
for(int i=1;i<=cnt_c;i++){
dfs(c[i],-1);
}
memset(g,-0x3f,sizeof(g));
g[1][0]=f[c[1]][0];
for(int i=2;i<=cnt_c;i++){
g[i][1]=g[i-1][0]+f[c[i]][1];
g[i][0]=max(g[i-1][1],g[i-1][0])+f[c[i]][0];
}
ans=max(g[cnt_c][1],g[cnt_c][0]);
memset(g,-0x3f,sizeof(g));
g[1][1]=f[c[1]][1];
for(int i=2;i<=cnt_c;i++){
g[i][1]=g[i-1][0]+f[c[i]][1];
g[i][0]=max(g[i-1][1],g[i-1][0])+f[c[i]][0];
}
ans=max(ans,g[cnt_c][0]);
cout<<fixed<<setprecision(1)<<(double)ans*k<<endl;
return 0;
}
感谢.JPG