The Shortest Path in Nya Graph
2014-08-20 17:50
344 查看
hdu4725:http://acm.hdu.edu.cn/showproblem.php?pid=4725
题意:给你一张无向图,然后这些点会分在不同的层中,相邻的层的任意两点之间的距离是c。然后还有一些额外边,有相应的边权,现在求1--n的最短距离。
题解:如果直接建图的话,会发现边的数量实在是太多了。所以这样朴素的建图方式肯定不行。于是,要加入一些点。怎么加呢?每一层加入两个点,,第i层加入的两个点是 n+i,和n+n+i,如果第u属于第i层,则需要建立两条有向边,u-->n+i;i+2*n--->u,同时第i层和i+1层之间建边,i+n--->i+1+2*n;i+n+1----->i+2*n;然后跑最短路,可能是这一题的边比较多,所以用spfa一直T,于是改用dijkstar加优先队列优化。
View Code
题意:给你一张无向图,然后这些点会分在不同的层中,相邻的层的任意两点之间的距离是c。然后还有一些额外边,有相应的边权,现在求1--n的最短距离。
题解:如果直接建图的话,会发现边的数量实在是太多了。所以这样朴素的建图方式肯定不行。于是,要加入一些点。怎么加呢?每一层加入两个点,,第i层加入的两个点是 n+i,和n+n+i,如果第u属于第i层,则需要建立两条有向边,u-->n+i;i+2*n--->u,同时第i层和i+1层之间建边,i+n--->i+1+2*n;i+n+1----->i+2*n;然后跑最短路,可能是这一题的边比较多,所以用spfa一直T,于是改用dijkstar加优先队列优化。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #define inf 1000000000+100 using namespace std; const int N=3e5+10; const int M=1e6+5e5; int n,m,c,u,v,w; struct Node{ int v; int next; int w; }edge[M]; struct Edge{ int u; int w; bool operator<(const Edge a) const{ return w>a.w; } }; int head ,cnt,dist ; bool vis ; void init(){ memset(head,-1,sizeof(head)); cnt=0; } void add(int u,int v,int w){ edge[cnt].v=v; edge[cnt].next=head[u]; edge[cnt].w=w; head[u]=cnt++; } int spfa(){ for(int i=1;i<=3*n;i++){ dist[i]=inf; vis[i]=0; } priority_queue<Edge>Q; vis[1]=1; dist[1]=0; Edge temp;temp.u=1;temp.w=0; Q.push(temp); while(!Q.empty()){ temp=Q.top(); Q.pop(); int u=temp.u; vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(dist[v]>edge[i].w+dist[u]){ dist[v]=edge[i].w+dist[u]; if(!vis[v]){ vis[v]=1; temp.u=v;temp.w=dist[v]; Q.push(temp); } } } } return dist ; } int main(){ int T,tt=1; scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&c); init(); for(int i=1;i<=n;i++){ scanf("%d",&u); add(i,u+n,0); add(u+2*n,i,0); } for(int i=1;i<n;i++){ add(i+n,i+n*2+1,c); add(i+n+1,i+2*n,c); } for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } int ans=spfa(); if(n==0)ans=inf; if(n==1)ans=0; if(ans==inf)printf("Case #%d: -1\n",tt++); else printf("Case #%d: %d\n",tt++,ans); } }
View Code
相关文章推荐
- hdu 4725 The Shortest Path in Nya Graph(堆+dij,最短路,5级)
- hdu 4725 The Shortest Path in Nya Graph
- HDU 4725 The Shortest Path in Nya Graph(最短路拆点)
- HDU 4725 The Shortest Path in Nya Graph dijkstra优化
- HDU 4725 The Shortest Path in Nya Graph(图论+最短路)
- hdu 4725 The Shortest Path in Nya Graph(堆+dij,最短路,5级)
- HDU 4725 The Shortest Path in Nya Graph
- CUGB图论专场:K - The Shortest Path in Nya Graph(dijkstra优先队列优化+线性构图入边)
- hdu4725 The Shortest Path in Nya Graph
- 【HDU】4725 The Shortest Path in Nya Graph 最短路
- hdu4725 The Shortest Path in Nya Graph
- HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】
- HDU-4725-The Shortest Path in Nya Graph
- HDU 4725 The Shortest Path in Nya Graph
- HDU 4725 The Shortest Path in Nya Graph (最短路)
- hdu 4725 The Shortest Path in Nya Graph
- HDU-4725 The Shortest Path in Nya Graph 最短路
- HDU 4725 The Shortest Path in Nya Graph
- hdu-4725-The Shortest Path in Nya Graph-层次网络
- hdu 4725 The Shortest Path in Nya Graph(dijkstra+优先队列)