PAT程序设计考题——甲级1003(Emergency ) C++实现

xiaoxiao2021-02-27  173

点击打开pat链接

#include<iostream> #include<math.h> #include<algorithm> #include<queue> #include<map> #include<stack> #include<string> #include<vector> using namespace std; #define INF 100000000 #define maxn 100010 struct edge{  int end,weight; }; struct node{  int pop;  vector<edge> bian; }; vector<node> ad; int w[maxn];//记录点权之和 int pre[maxn]; int vt[maxn]; vector<int>  result; int accord[maxn];//记录到到每个点最短路径的条数 bool visit[maxn]={false}; void Dji(int v,int num){  fill(vt,vt+num,INF);  fill(w,w+num,0);  fill(accord,accord+num,0);  vt[v]=0;  accord[v]=1;  w[v]=ad[v].pop; // cout<<w[v];  for(int i=0;i<num;i++)  {   int u=-1,store=INF;   for(int j=0;j<num;j++)   {    if(vt[j]<store&&visit[j]==false){     u=j;     store=vt[j];    }   }   if(u==-1) return;   visit[u]=true;   for(int k=0;k<ad[u].bian.size();k++)   { int z;   z=ad[u].bian[k].end;   if(visit[z]==false){   if(vt[u]+ad[u].bian[k].weight<vt[z])   {   vt[z]=vt[u]+ad[u].bian[k].weight;   accord[z]=accord[u];   w[z]=w[u]+ad[z].pop;}   else if(vt[u]+ad[u].bian[k].weight==vt[z])   { if(w[u]+ad[z].pop>w[z])   w[z]=w[u]+ad[z].pop;   accord[z]+=accord[u]; //注意路径的写法    }   }   }   }  } int main() {int city,c1,c2,num; cin>>city>>num>>c1>>c2; int pop; for(int i=0;i<city;i++) {  node temp;  cin>>pop;  temp.pop = pop;  ad.push_back(temp); } for (int i = 0; i < num; i++) {  int start, end, weight;  cin >> start >> end >> weight;  edge qw;  qw.end = end; qw.weight = weight;  ad[start].bian.push_back(qw);  qw.end=start;  ad[end].bian.push_back(qw); } Dji(c1,city); /*for(int i=0;i<ad[4].bian.size();i++) cout<<ad[4].bian[i].end<<" "<<ad[4].bian[i].weight<<endl;*/ cout<<accord[c2]<<" "<<w[c2];  return 0; }

转载请注明原文地址: https://www.6miu.com/read-11021.html

最新回复(0)