stylus @ 2024-01-24 09:00:29
第一个(这个其实能过,但MLE了:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,h;
};
bool operator <(node a,node b){
return a.h>b.h;
}
int n,m,s,a[10001][10001],d[10001],u,v,w;
void bfs(){
priority_queue<node>q;
q.push({s,0}),d[s]=0;
while(q.size()){
node s=q.top();
q.pop();
for(int i=1;i<=n;i++){
if(a[s.x][i]==-1)continue;
if(d[i]>d[s.x]+a[s.x][i])d[i]=d[s.x]+a[s.x][i],q.push({i,d[i]});
}
}for(int i=1;i<=n;i++)cout<<d[i]<<' ';
return;
}
int main(){
memset(a,-1,sizeof(a)),memset(d,114514,sizeof(d));
cin>>n>>m>>s;
for(int i=0;i<m;i++)cin>>u>>v>>w,a[u][v]=w;
bfs();
return 0;
}
然后我又改了一下(却错了:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,h;
};
bool operator <(node a,node b){
return a.h>b.h;
}
int n,m,s,d[10001],u,v,w;
map<pair<int,int>,int>mp;
void bfs(){
priority_queue<node>q;
q.push({s,0}),d[s]=0;
while(q.size()){
node s=q.top();
q.pop();
for(int i=1;i<=n;i++){
if(mp[{s.x,i}]==-1)continue;
if(d[i]>d[s.x]+mp[{s.x,i}])d[i]=d[s.x]+mp[{s.x,i}],q.push({i,d[i]});
}
}for(int i=1;i<=n;i++)cout<<d[i]<<' ';
return;
}
void init(){
memset(d,114514,sizeof(d));
mp.clear();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j)mp[{i,j}]=-1;
}
}return;
}
int main(){
init();
cin>>n>>m>>s;
for(int i=0;i<m;i++)cin>>u>>v>>w,mp[{u,v}]=w;
bfs();
return 0;
}
by __My0217__ @ 2024-01-24 10:37:21
@5520qq 但是后面算的时候会不会加个-1然后寄掉
by stylus @ 2024-01-24 10:45:12
@My0217 那个?
by __My0217__ @ 2024-01-24 10:51:15
@5520qq 就是初始化,你初始化成-1对吧,然后你后面直接判断是不是更短,然后那个-1加上去 答案就寄掉了
by stylus @ 2024-01-24 10:58:28
@My0217 所以怎么改呢?
by __My0217__ @ 2024-01-24 11:00:17
@5520qq 建议还是判一下 ==-1 continue