02Ljh @ 2022-09-05 22:05:33
Rt 板子会打 但Edge学不明白
自己打了一份不正经的存图方式 样例过了 but 0pts
求大佬指出这种方式的不合理性
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define MAXN 10019
struct l
{
vector<int> bq;//连向的边
vector<int> vq;//边权
} all[MAXN];
struct lx
{
int pos,w;
friend bool operator <(lx x,lx y)
{
return x.w<y.w;
}
} temp;
priority_queue<lx> q;
int dis[MAXN];
bool vi[MAXN];
int n,m,s;
void dij()
{
while(!q.empty())
{
int now=q.top().pos;
q.pop();
if(vi[now]) continue;
vi[now]=true;
for(int i=0;i<all[now].bq.size();i++)
{
dis[all[now].bq[i]]=min(dis[all[now].bq[i]],dis[now]+all[now].vq[i]);
//cout<<"dis["<<all[now].bq[i]<<"]="<<dis[all[now].bq[i]]<<"\n";
temp.pos=all[now].bq[i];
temp.w=all[now].vq[i];
q.push(temp);
}
}
return ;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
all[u].bq.push_back(v);
all[u].vq.push_back(w);
}
memset(dis,INF,sizeof(dis));
dis[s]=0;
temp.pos=s;
temp.w=0;
q.push(temp);
dij();
for(int i=1;i<=n;i++) cout<<(dis[i]==INF?2147483647:dis[i])<<" ";
return 0;
}
by Kanbe_Kotori @ 2022-09-05 22:16:48
存图方式感觉没啥问题,应该是其他地方写错了
by _djc_ @ 2022-09-05 23:14:50
阿哲……您的代码看起来好废命……
楼上大佬说了不是存图的问题
首先是 dijkstra 写的不对,更新 dis 一定是在当前 dis 不是最优的时候在队列里加入状态
第二点是您优先队列里的状态不对,对于堆中的状态我们不是选他边权最小的,而是选 dis 最小的(雾
最后一点就是您的重载运算符写错了……(找了好半天,大雾
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define MAXN 500019
struct l
{
vector<int> bq;//连向的边
vector<int> vq;//边权
} all[MAXN];
struct lx
{
int pos,w;
bool operator <(const lx &x)const
{
return x.w<w;
}
} temp;
priority_queue<lx> q;
int dis[MAXN];
bool vi[MAXN];
int n,m,s;
void dij()
{
while(!q.empty())
{
int now=q.top().pos;
q.pop();
if(vi[now]) continue;
vi[now]=true;
for(int i=0;i<all[now].bq.size();i++)
{
if(dis[all[now].bq[i]] > dis[now]+all[now].vq[i]){
dis[all[now].bq[i]] = dis[now]+all[now].vq[i];
temp.pos=all[now].bq[i];
temp.w=dis[all[now].bq[i]];
q.push(temp);
}
//cout<<"dis["<<all[now].bq[i]<<"]="<<dis[all[now].bq[i]]<<"\n";
}
}
return ;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
all[u].bq.push_back(v);
all[u].vq.push_back(w);
}
memset(dis,INF,sizeof(dis));
dis[s]=0;
temp.pos=s;
temp.w=0;
q.push(temp);
dij();
for(int i=1;i<=n;i++) cout<<(dis[i]==INF?2147483647:dis[i])<<" ";
return 0;
}
by 02Ljh @ 2022-09-06 20:09:57
@Di_jcheng @o_scary_ang
谢谢大佬们 Orz %%%
主要是 Edge 实在没理解