-
The Shortest Path in Nya Graph
- HDU - 4725
- 给每个点两个辅助点,一个做出度,一个做入度,赋其与辅助点边权为0(因为原本就是一个点),而且这两个辅助点完全可以按照层数来排列。
-
#include<bits/stdc++.h> using namespace std; #define maxn 511111 #define inf 0x3f3f3f3f int n,m,c,t,d,u,v,w; struct node { int v,w; bool operator<(const node &a)const { return w>a.w; } } dis[maxn],top; vector<node>mmp[maxn]; void dij() { for(int i=1; i<=3*n; i++) { dis[i].v=i; dis[i].w=inf; } dis[1].w=0; priority_queue<node>q; q.push(dis[1]); while(!q.empty()) { top=q.top(); q.pop(); int len=mmp[top.v].size(); for(int i=0; i<len; i++) { if(dis[mmp[top.v][i].v].w>dis[top.v].w+mmp[top.v][i].w) { dis[mmp[top.v][i].v].w=dis[top.v].w+mmp[top.v][i].w; q.push(dis[mmp[top.v][i].v]); } } } if(dis[n].w==inf) printf("-1\n"); else printf("%d\n",dis[n].w); } int main() { scanf("%d",&t); for(int p=1;p<=t;p++) { scanf("%d%d%d",&n,&m,&c); for(int i=1;i<=n*3;i++) mmp[i].clear(); for(int i=1; i<=n; i++) { scanf("%d",&d); mmp[i].push_back((node){n+d*2-1,0}); mmp[n+d*2].push_back((node){i,0}); } for(int i=1;i<n;i++) { mmp[n+i*2-1].push_back((node){n+2*i+2,c}); mmp[n+i*2+1].push_back((node){n+2*i,c}); } for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); mmp[u].push_back((node){v,w}); mmp[v].push_back((node){u,w}); } printf("Case #%d: ",p); dij(); } return 0; }
The Shortest Path in Nya Graph-虚点建图
最新推荐文章于 2020-07-10 15:02:13 发布