团体程序设计天梯赛-练习集
Posted tingtin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了团体程序设计天梯赛-练习集相关的知识,希望对你有一定的参考价值。
1 L2-001 紧急救援(25 分) 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <vector> 8 #include <utility> 9 #include <queue> 10 using namespace std; 11 typedef pair<int,int>P; 12 int n,m,s,d; 13 const int N=550; 14 const int inf=0x3f3f3f3f; 15 int val[N],dis[N],pre[N],prenum[N]; 16 int tval[N]; 17 struct Node{ 18 int to,w; 19 Node(){} 20 Node(int TO,int W){ 21 to=TO; 22 w=W; 23 } 24 }; 25 vector<Node>vec[N]; 26 void bfs(int sta){ 27 priority_queue<P,vector<P>,greater<P> >que; 28 que.push(P(0,sta));//此时的优先队列会按照first的值排序 29 prenum[sta]=1;//1,不是0 30 tval[sta]=val[sta]; 31 dis[sta]=0; 32 while(!que.empty()){ 33 P q=que.top(); 34 que.pop();//容易忘记,弹出队列 35 int v=q.second; 36 if(dis[v]<q.first) continue; 37 for(int i=0;i<vec[v].size();i++){ 38 Node Nod=vec[v][i]; 39 int t=Nod.to; 40 if(dis[t]>dis[v]+Nod.w){ 41 dis[t]=dis[v]+Nod.w; 42 pre[t]=v;//记录最短路上的该点的前一个点 43 tval[t]=tval[v]+val[t];//救援队数目是依次累加的 44 prenum[t]=prenum[v]; 45 que.push(P(dis[t],t));//容易忘记,压入队列 46 } 47 else if(dis[t]==dis[v]+Nod.w){ 48 prenum[t]+=prenum[v];//到t的路径数目要加上到v的路径数目 49 if(tval[t]<tval[v]+val[t]){//只有救援队数目多了,才会更新节点 50 tval[t]=tval[v]+val[t]; 51 pre[t]=v; 52 } 53 } 54 } 55 } 56 } 57 int main() 58 { 59 scanf("%d%d%d%d",&n,&m,&s,&d); 60 for(int i=0;i<n;i++) 61 scanf("%d",&val[i]); 62 int x,y,z; 63 for(int i=0;i<m;i++){ 64 scanf("%d%d%d",&x,&y,&z); 65 vec[x].push_back(Node(y,z)); 66 vec[y].push_back(Node(x,z));//本题为无向图 67 } 68 memset(pre,-1,sizeof(pre));//不能初始化为0,0也是节点 69 memset(dis,inf,sizeof(dis)); 70 bfs(s); 71 printf("%d %d ",prenum[d],tval[d]); 72 int ans=0; 73 int ret[N]; 74 int cur=d; 75 while(cur!=-1){ 76 ret[ans++]=cur; 77 cur=pre[cur]; 78 } 79 for(int i=ans-1;i>=0;i--){ 80 printf("%d%c",ret[i],i==0?‘ ‘:‘ ‘); 81 } 82 return 0; 83 }
以上是关于团体程序设计天梯赛-练习集的主要内容,如果未能解决你的问题,请参考以下文章