关于我的代码
查看原帖
关于我的代码
1068781
wangxx2012楼主2025/7/24 20:14

为何这样打

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,t,k;
double head[1000010],dis[1000010];
struct node{
	int to,next;
	double w;
}e[1000010];
int st[10000010];
void adde(int u,int v,double w){
	e[++k].to=v;
	e[k].w=1-w;
	e[k].next=head[u];
	head[u]=k;
}
void spfa(int s){
	queue<int> q;
	for(int i=1;i<=n;i++) dis[i]=0;
	dis[s]=1; q.push(s);
	st[s]=1;
	while(!q.empty()){
		int t=q.front();
		q.pop();
		st[t]=0;
		for(int i=head[t];~i;i=e[i].next){
			int v=e[i].to;
			if(dis[v]<dis[t]*e[i].w){
				dis[v]=dis[t]*e[i].w;
				if(!st[v]){
					st[v]=1;
					q.push(v);
				}
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		adde(u,v,(double)w/100);
		adde(v,u,(double)w/100);
	}
	cin>>s>>t;
	spfa(s);
	printf("%.8lf",100/dis[t]);
	return 0;
}

就连样例都会TLE。
但是这样

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,t,k;
double head[1000010],dis[1000010];
struct node{
	int to,next;
	double w;
}e[1000010];
int st[10000010];
void adde(int u,int v,double w){
	e[++k].to=v;
	e[k].w=1-w;
	e[k].next=head[u];
	head[u]=k;
}
void spfa(int s){
	queue<int> q;
	for(int i=1;i<=n;i++) dis[i]=0;
	dis[s]=1; q.push(s);
	st[s]=1;
	while(!q.empty()){
		int t=q.front();
		q.pop();
		st[t]=0;
		for(int i=head[t];~i;i=e[i].next){
			int v=e[i].to;
			if(dis[v]<dis[t]*e[i].w){
				dis[v]=dis[t]*e[i].w;
				if(!st[v]){
					q.push(v);
					st[v]=1;
				}
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		adde(u,v,(double)w/100);
		adde(v,u,(double)w/100);
	}
	cin>>s>>t;
	spfa(s);
	printf("%.8lf",100/dis[t]);
	return 0;
}

就能AC。这两份代码的区别就仅仅是第31和32行代码交换。由st[v]=1; q.push(v);变成q.push(v); st[v]=1;。为何会这样?

2025/7/24 20:14
加载中...