社区讨论

CF25C Roads in Berland,这个题用堆优迪杰斯特拉为啥会T

学术版参与者 13已保存回复 18

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
18 条
当前快照
1 份
快照标识符
@mi7y9z9u
此快照首次捕获于
2025/11/21 05:35
4 个月前
此快照最后确认于
2025/11/21 06:42
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 
#include<queue>
using namespace std;
int n,a[305][305],k,u[305],v[305],d[305],head[305],cnt,dis[305];
bool vis[305];
long long ans;
struct Edge{
	int to,next,w;
}edge[1000005];
void add_edge(int from,int to,int dis)
{
	edge[++cnt].next=head[from];
	edge[cnt].to=to;
	edge[cnt].w=dis;
	head[from]=cnt;
}
void dijkstra(int s)
{
	priority_queue< pair<int,int> > q;
	for(int i=1;i<=n;i++) dis[i]=0x3f3f3f3f;
	memset(vis,0,sizeof(vis));
	q.push(make_pair(0,s));
	dis[s]=0;
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		if(vis[x]) continue;
		vis[x]=false;
		for(int i=head[x];i;i=edge[i].next)
		{
			if(dis[edge[i].to]>dis[x]+edge[i].w)
			{
				dis[edge[i].to]=dis[x]+edge[i].w;
				q.push(make_pair(-dis[edge[i].to],edge[i].to));
			}
			    
			    
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++)
	    {
	    	scanf("%d",&a[i][j]);
	    	if(a[i][j]!=0) add_edge(i,j,a[i][j]); 
		}
	scanf("%d",&k);
	for(int i=1;i<=k;i++)
	{
		ans=0;
		scanf("%d%d%d",&u[i],&v[i],&d[i]);
		add_edge(u[i],v[i],d[i]);
		add_edge(v[i],u[i],d[i]);
		for(int j=1;j<=n;j++)
		{
			dijkstra(j);
			for(int t=1;t<=n;t++) ans+=(long long)dis[t];
		}
		printf("%ld ",ans/2);
	}
	return 0;
}
堆优不是很快吗,怎么会T呢

回复

18 条回复,欢迎继续交流。

正在加载回复...