您的位置:首页 > 其它

HDU 1009 The Shortest Path in Nya Graph

2013-09-12 20:26 239 查看
  迪杰斯特拉 + 优先队列

  

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>

#define LL __int64

const LL INF = 2000000000;

using namespace std;

LL dis[300100];

int head[300100];

struct E
{
int u,v,w,next;
}edge[1001000];

int top;

void link(int u,int v,int w)
{
edge[top].u = u;
edge[top].v = v;
edge[top].w = w;
edge[top].next = head[u];
head[u] = top++;
}

struct HeapNode
{
int d,u;
bool operator < (const HeapNode& rhs) const{
return d>rhs.d;
}
};

void dij(int st,int n)
{
priority_queue<HeapNode> q;

HeapNode p;

p.d = 0;
p.u = 1;

q.push(p);

while(q.empty() == false)
{
HeapNode x = q.top();
q.pop();

int u = x.u;

st = head[u];

while(st != -1)
{
if(dis[u] + edge[st].w < dis[edge[st].v])
{
dis[edge[st].v] = edge[st].w + dis[u];

HeapNode temp;

temp.d = dis[edge[st].v];
temp.u = edge[st].v;
q.push(temp);
}
st = edge[st].next;

}
}

if(dis
== INF)
cout<<"-1"<<endl;
else
cout<<dis
<<endl;
}

int main()
{
int i,n,m,c,u,v,w;
int T,icase = 0;

cin>>T;
while(T--)
{
scanf("%d %d %d",&n,&m,&c);

memset(head,-1,(n*3+2)*sizeof(int));

top = 0;

for(i = 1;i <= n; ++i)
{
scanf("%d",&u);

link(n+2*u-1,i,0);
link(i,n+u*2,0);
}

for(i = 1;i < n; ++i)
{
link(n+i*2+2,n+i*2-1,c);
link(n+i*2,n+i*2+1,c);
}

for(i = 1;i <= m; ++i)
{
scanf("%d %d %d",&u,&v,&w);
link(u,v,w);
link(v,u,w);
}

for(i = 1,n *= 3;i <= n; ++i)
{
dis[i] = INF;
}

dis[1] = 0;

printf("Case #%d: ",++icase);
dij(1,n/3);

}
return 0;
}


View Code

  墨迹了一下午 效率低了一13
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: