社区讨论
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 条回复,欢迎继续交流。
正在加载回复...