int n,G[MAXV][MAXV]; int d[MAXV]; bool vis[MAXV]={false}; void Dijkstra(int s) { fill(d,d+MAXV,INF); d[s]=0; for(int i=0;i<n;i++) { int u=-1,MIN=INF; for(int j=0;j<n;j++) { if(!vis[j] && d[j]<MIN) { u=j; MIN=d[j]; } } if(u==-1) return ; vis[u]=true; for(int v=0;v<n;v++) { if(vis[v]==false && G[u][v]!=INF && d[u]+G[u][v]<d[v]) { d[v]=d[u]+G[u][v]; } } } } struct Node{ int v,dis; }; vector<Node>Adj[MAXV]; bool vis[MAXV]; void Dijkstar(int s) { fill(d,d+MAXV,INF); d[s]=0; for(int i=0;i<n;i++) { int u=-1,MIN=INF; for(int j=0;j<n;j++) { if(vis[j]==false && d[j]<MIN) { u=j; MIN=d[j]; } } if(u==-1) return ; vis[u]=true; for(int j=0;j<Adj[u].size();j++) { int v=Adj[u][j].v; if(vis[v]==false && d[u]+Adj[u][j].dis<d[v]) { d[v]=d[u]+Adj[u][j].dis; } } } } #include<vector> #include<cstdio> #include<iostream> #include<algorithm> #include<queue> using namespace std; struct Node{ int v,dis; }; //struct Node2{ // int v,d,vis; // friend bool operator<(const Node2 &x,const Node2 &y) // { // if(x.vis!=y.vis) return x.vis > y.vis; // return x.d<y.d; // } //}; const int MAXV = 1000; const int INF = 0xFFFFFFF; vector<Node>Adj[MAXV]; int n,m,d[MAXV]; bool vis[MAXV]={false}; void Dijkstra(int s) { fill(d,d+MAXV,INF); d[s]=0; //priority_queue<Node2>q; //Node2 temp; //for(int i=0;i<n;i++) //{ // temp.d=d[i]; temp.v=i; temp.vis=0; // q.push(temp); //} for(int i=0;i<n;i++) { int u=-1,MIN=INF; //temp=q.front(); q.pop(); //if(temp.vis==true || temp.d==INF) return ; //temp.vis=true; //for(int j=0;j<n;j++) //{ // if(vis[j]==false && d[j]<MIN) // { // u=j; // MIN=d[j]; // } //} //if(u==-1) return ; vis[u]=true; for(int j=0;j<Adj[u].size();j++) { int v=Adj[u][j].v; if(vis[v]==false && d[u]+Adj[u][j].dis<d[v]) { d[v]=Adj[u][j].dis+d[u]; } } } } int main(void) { int s , u , v; Node edge; cin >> n >> m >> s; for(int i=0;i<m;i++) { cin >> u >> edge.v >> edge.dis; Adj[u].push_back(edge); } Dijkstra(s); for(int i=0;i<n;i++) printf("%d ",d[i]); return 0; } /* 6 8 0 0 1 1 0 3 4 0 4 4 1 3 2 2 5 1 3 2 2 3 4 3 4 5 3 */