您的位置:首页 > 其它

HDU4725 The Shortest Path in Nya Graph dij

2016-03-26 18:41 274 查看
分析:对于每一层,原来n个点,然后扩展为原来的三倍,每一层扩展一个入点,一个出点,然后跑最短路

注:tmd我把一个n写成m了,然后wa了7次,我都要怀疑人生了

#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
struct Edge{
int v,w,next;
bool operator<(const Edge &e)const{
return w>e.w;
}
}edge[N*20];
int head[N*3],tot,n,m,c,d[N*3];
void add(int u,int v,int w){
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
priority_queue<Edge>q;
bool vis[N*3];
int dij(int s,int t){
for(int i=1;i<=n;++i)d[i]=INF,vis[i]=0;
d[s]=0,q.push(Edge{s,0,0});
while(!q.empty()){
while(!q.empty()&&vis[q.top().v])q.pop();
if(q.empty())break;
int u=q.top().v;
q.pop();
vis[u]=1;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(!vis[v]&&d[v]>d[u]+edge[i].w){
d[v]=d[u]+edge[i].w;
q.push(Edge{v,d[v],0});
}
}
}
return d[t]==INF?-1:d[t];
}
vector<int>g
;
int main(){
int T,cas=0;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&c);
for(int i=1;i<=n;++i)g[i].clear();
for(int i=1;i<=n;++i){
int x;
scanf("%d",&x);
g[x].push_back(i);
}
memset(head,-1,sizeof(head));
tot=0;
for(int i=1;i<=m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
for(int i=1;i<=n;++i){
if(!g[i].size())continue;
if(i>1&&g[i-1].size())
add(n+i,2*n+i-1,c);
if(i<n&&g[i+1].size())
add(n+i,2*n+i+1,c);
for(int j=0;j<g[i].size();++j)
add(g[i][j],i+n,0),add(i+2*n,g[i][j],0);
}
n*=3;
printf("Case #%d: %d\n",++cas,dij(1,n/3));
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: