加了快读错了?
  • 板块学术版
  • 楼主Deamer
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/6 18:41
  • 上次更新2023/10/27 08:27:05
查看原帖
加了快读错了?
585962
Deamer楼主2022/10/6 18:41

我在做 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;
}

提交记录

2022/10/6 18:41
加载中...