输入:
6 9 1
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
输出:
0 1 8 4 13 17
Code:
1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 #define PII pair<int,int> 6 const int maxn=10000,maxm=1000; 7 int cnt=0,edge[maxm],ver[maxm],nxt[maxm],head[maxn]; 8 int d[maxn]; 9 bool v[maxn];//v[i]表示i点是否松弛 10 priority_queue < PII,vector<PII>,greater<PII> > q;//优先队列,以p.first最小优先 11 inline void add(int x,int y,int z) 12 { 13 cnt++; 14 ver[cnt]=y; 15 edge[cnt]=z; 16 nxt[cnt]=head[x]; 17 head[x]=cnt; 18 } 19 inline void dijk(int t) 20 { 21 int i; 22 memset(d,0x3f,sizeof(d)); 23 memset(v,0,sizeof(v)); 24 d[t]=0; 25 for(i=head[t];i;i=nxt[i]) 26 d[ver[i]]=edge[i];//d[i]为t->i当前的最小值 27 28 q.push(make_pair(0,t)); 29 while(!q.empty()) 30 { 31 int mind=q.top().second;//mind为距离t距离最小的点 32 q.pop(); 33 if(v[mind]==1)//已松弛过 34 continue; 35 for(i=head[mind];i;i=nxt[i]) 36 { 37 if(d[mind]+edge[i]<d[ver[i]])//(t->mind)-->ver[i]距离取更小d[ver[i]] 38 d[ver[i]]=d[mind]+edge[i]; 39 q.push( make_pair(d[ver[i]],ver[i]) ); 40 } 41 v[mind]=1; 42 } 43 } 44 int main() 45 { 46 int n,m,i,t; 47 cin>>n>>m>>t; 48 for(i=0;i<m;i++) 49 { 50 int a,b,c; 51 cin>>a>>b>>c; 52 add(a,b,c); 53 } 54 dijk(t); 55 for(i=1;i<n;i++) 56 cout<<d[i]<<" "; 57 cout<<d[n];//格式 58 return 0; 59 }
------------恢复内容结束------------