#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<climits>
#include<iterator>
using namespace std;
struct edge{
int to,dis;
edge(int tos=0,int diss=0):to(tos),dis(diss){}
};
long long dis[10005],inqueue[10005],outqueue[10005];
struct poi{
int num;
poi(int nus):num(nus){
}
bool operator <(const poi v1)const{
return dis[num]>dis[v1.num] ;
}
};
vector<edge>g[10005];
priority_queue<poi> edges;
int main(){
memset(dis,0x7f,sizeof dis);
memset(inqueue,0,sizeof inqueue);
memset(outqueue,0,sizeof outqueue);
int n,m,s;
s=1;
cin>>n>>m>>s;
for(int i=0;i<m;++i){
int a,b,l;
cin>>a>>b>>l;
if(a==b)l=0;
g[a].push_back(edge(b,l)) ;
}
for(int i=0;i<g[s].size() ;++i){
dis[g[s][i].to]=g[s][i].dis;
}
dis[s]=0;
edges.push(poi(s));
while(!edges.empty() ){
poi k=edges.top() ;
edges.pop() ;
outqueue[k.num ]++;
for(int i=0;i<g[k.num].size() ;++i){
int v=g[k.num][i].to;
int ldis=g[k.num][i].dis;
if(inqueue[v]<1){
inqueue[v]++;
if(dis[k.num]+ldis<dis[v]){
dis[v]=dis[k.num]+ldis;
}
edges.push(poi(v));
}else{
if(outqueue[v]<1){
if(dis[k.num]+ldis<dis[v]){
dis[v]=dis[k.num]+ldis;
}
}
}
}
}
// if(dis[n]>1e9){
// cout<<-1<<endl;
// return 0;
// }
// cout<<dis[n]<<endl;
for(int i=1;i<=n;++i){
if(dis[i]>1e9){
cout<<INT_MAX<<" ";
continue;
}
cout<<dis[i]<<" ";
}
// cout<<endl;
return 0;
}
为什么20分? 我写的堆优化 我的数组也开对了 为什么wa 求助