您的位置:首页 > 其它

HDU 4725 The Shortest Path in Nya Graph

2015-04-07 20:08 423 查看
Description

This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just move on.

The Nya graph is an undirected graph with "layers". Each node in the graph belongs to a layer, there are N nodes in total.

You can move from any node in layer x to any node in layer x + 1, with cost C, since the roads are bi-directional, moving from layer x + 1 to layer x is also allowed with the same cost.

Besides, there are M extra edges, each connecting a pair of node u and v, with cost w.

Help us calculate the shortest path from node 1 to node N.


Input

The first line has a number T (T <= 20) , indicating the number of test cases.

For each test case, first line has three numbers N, M (0 <= N, M <= 10 5) and C(1 <= C <= 10 3), which is the number of nodes, the number of extra edges and cost of moving between adjacent layers.

The second line has N numbers l i (1 <= l i <= N), which is the layer of i th node belong to.

Then come N lines each with 3 numbers, u, v (1 <= u, v < =N, u <> v) and w (1 <= w <= 10 4), which means there is an extra edge, connecting a pair of node u and v, with cost w.


Output

For test case X, output "Case #X: " first, then output the minimum cost moving from node 1 to node N.

If there are no solutions, output -1.


Sample Input

2
3 3 3
1 3 2
1 2 1
2 3 1
1 3 3

3 3 3
1 3 2
1 2 2
2 3 2
1 3 4




Sample Output

Case #1: 2
Case #2: 3 

把每一层拆成两个点,在连线,然后最短路,dijkstra+优先队列搞定

#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
using namespace std;
const int maxn=300005;
int T,n,m,c,x,y,z,f[maxn],ins[maxn];
struct abc
{
	int x,v;
	abc(){}
	abc(int x,int v):x(x),v(v){}
};

bool operator<(const abc&a,const abc&b)
{
	if (a.v==b.v) return a.x<b.x;
	return a.v>b.v;
}

vector<abc> map[maxn];

void bfs()
{
	priority_queue<abc> p;
	f[1]=0;
	p.push(abc(1,0));
	while (!p.empty())
	{
		abc q=p.top(); p.pop(); 
		if (ins[q.x]) continue;
		ins[q.x]=1;
		if (q.x==n) break;
		for (int i=0;i<map[q.x].size();i++)
		{
			abc y=map[q.x][i];
			if (!ins[y.x]&&f[y.x]>f[q.x]+y.v)
			{
				f[y.x]=f[q.x]+y.v;
				p.push(abc(y.x,f[y.x]));
			}
		}
	}
	if (f
<0x7FFFFFFF) printf("%d\n",f
);
	else printf("-1\n");
}

int main()
{
	scanf("%d",&T);
	for (int i=1;i<=T;i++)
	{
		scanf("%d%d%d",&n,&m,&c);
		for (int j=1;j<=3*n;j++) 
		{
			map[j].clear();
			f[j]=0x7FFFFFFF;
			ins[j]=0;
		}
		for (int j=1;j<=n;j++)
		{
			scanf("%d",&x);
			map[x+n+n].push_back(abc(j,0));
			map[j].push_back(abc(x+n,0));
		}
		for (int j=n+1;j<=n+n;j++)
		if (map[j+n].size())
		{
			if (j>n+1&&map[j+n-1].size()) map[j].push_back(abc(n+j-1,c));
			if (j<n+n&&map[j+n+1].size()) map[j].push_back(abc(n+j+1,c));
		}
		for (int j=1;j<=m;j++)
		{
			scanf("%d%d%d",&x,&y,&z);
			map[x].push_back(abc(y,z));
			map[y].push_back(abc(x,z));
		}
		printf("Case #%d: ",i);	bfs();
	}
}


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