PTA 紧急救援

https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840

//
找边,记下边来,唯一不同的是,点有权值,找使得点的总权值最大的最短边 // #include<iostream> #include<string.h> #include<vector> using namespace std; int n,m,st,ed,vcost[500+10],w[500+10][500+10],vis[500+10],d[500+10]; const int INF=1e7; vector <int> path,ans;int vcostmax=-1; vector <int>::iterator it; int ansnum=0; int refind(int pos){ if(pos==st){ //到达起点,终止 //计算该path vcost和 int t=0; for(auto x:path) t+=vcost[x]; if(t>vcostmax){ vcostmax=t; ans.clear(); it=path.end()-1; for(;it>=path.begin();it--) ans.push_back(*it); } /*for(auto x:path) cout<<x<<" "; cout<<endl; */ ansnum++; return 0; } //find father for(int i=0;i<n;i++){ if(d[i]+w[i][pos]==d[pos]&&i!=pos){ path.push_back(i); refind(i); path.pop_back(); } } } int main(){ cin>>n>>m>>st>>ed; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) d[i]=(i==st?0:INF); //边权值初始化 for(int i=0;i<n;i++) for(int j=0;j<n;j++) (i==j)?(w[i][j]=0):(w[i][j]=INF); for(int i=0;i<n;i++) cin>>vcost[i]; for(int i=0;i<m;i++){ int u,v; scanf("%d%d",&u,&v); scanf("%d",&w[u][v]); } //dijkstra sssp for(int i=0;i<n;i++){ int minD=INF,rem; for(int j=0;j<n;j++) if(!vis[j]&&d[j]<minD){ minD=d[j]; rem=j; } vis[rem]=1; for(int j=0;j<n;j++) d[j]=min(d[j],d[rem]+w[rem][j]); } //DFS反向找出路径 path.push_back(ed); refind(ed); cout<<ansnum<<" "<<vcostmax<<endl; for(auto x:ans) (x!=ed)?(cout<<x<<" "):(cout<<x<<endl); return 0; }

//哪错了啊啊啊为什么啊啊啊

猜你喜欢

转载自www.cnblogs.com/spzeno/p/10582278.html