我在做 P1186
的时候,曾多次10分,把快读改成 scanf 就A了,有大佬帮萌新看看嘛?
加快读代码:
#include<bits/stdc++.h>
using namespace std;
const int N=210,M=4e4+10;
const int INF=0x7f7f7f7f;
int n,m,s=1;
int cnt;
struct coord { int x,y; } a[N];
struct Edge{
int to,next;
double w;
}edge[M<<1];
int head[N];
int p[N];
double dis[N];
bool flag,vis[N],vi[N][N];
double ans=INF;
inline int read(){
char ch=getchar();int x=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
inline double dist(int u,int v){
return double(sqrt(double(a[u].x-a[v].x)*double(a[u].x-a[v].x)+double(a[u].y-a[v].y)*double(a[u].y-a[v].y)));
}
void add(int u,int v,double w){
cnt++;
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
struct node{
int id; double dis;
bool operator < (const node &x) const{
return dis > x.dis ;
}
};
void Dijkstra(){
priority_queue<node> q;
for(int i=1;i<=n;i++) { dis[i]=INF; vis[i]=0; }
dis[s]=0;
q.push(node{s,dis[s]});
while(!q.empty()){
node x=q.top(); q.pop();
int u=x.id;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to; double w=edge[i].w;
if(vis[v] || vi[u][v]==true) continue;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!flag) p[v]=u;
q.push(node{v,dis[v]});
}
}
}
}
int main(){
n=read(); m=read();
for(int i=1;i<=n;i++){
a[i].x=read(); a[i].y=read();
}
for(int i=1;i<=m;i++){
int u,v; double w;
u=read(); v=read(); w=dist(u,v);
add(u,v,w); add(v,u,w);
}
Dijkstra();
flag=true;
for(int i=n;i;i=p[i]){
if(i==1) break;
vi[i][p[i]]=vi[p[i]][i]=true;
Dijkstra();
vi[i][p[i]]=vi[p[i]][i]=false;
ans=min(ans,dis[n]);
}
if(ans==INF) printf("-1\n");
else printf("%.2lf\n",ans);
return 0;
}
换成scanf的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=210,M=4e4+10;
const int INF=0x7f7f7f7f;
int n,m,s=1;
int cnt;
struct coord { int x,y; } a[N];
struct Edge{
int to,next;
double w;
}edge[M<<1];
int head[N];
int p[N];
double dis[N];
bool flag,vis[N],vi[N][N];
double ans=INF;
inline double dist(int u,int v){
return double(sqrt(double(a[u].x-a[v].x)*double(a[u].x-a[v].x)+double(a[u].y-a[v].y)*double(a[u].y-a[v].y)));
}
void add(int u,int v,double w){
cnt++;
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
struct node{
int id; double dis;
bool operator < (const node &x) const{
return dis > x.dis ;
}
};
void Dijkstra(){
priority_queue<node> q;
for(int i=1;i<=n;i++) { dis[i]=INF; vis[i]=0; }
dis[s]=0;
q.push(node{s,dis[s]});
while(!q.empty()){
node x=q.top(); q.pop();
int u=x.id;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to; double w=edge[i].w;
if(vis[v] || vi[u][v]==true) continue;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!flag) p[v]=u;
q.push(node{v,dis[v]});
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=1;i<=m;i++){
int u,v; double w;
scanf("%d%d",&u,&v); w=dist(u,v);
add(u,v,w); add(v,u,w);
}
Dijkstra();
flag=true;
for(int i=n;i;i=p[i]){
if(i==1) break;
vi[i][p[i]]=vi[p[i]][i]=true;
Dijkstra();
vi[i][p[i]]=vi[p[i]][i]=false;
ans=min(ans,dis[n]);
}
if(ans==INF) printf("-1\n");
else printf("%.2lf\n",ans);
return 0;
}