HDU 4725 The Shortest Path in Nya Graph

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[n]<0x7FFFFFFF) printf("%d\n",f[n]);
	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();
	}
}


你可能感兴趣的:(最短路,HDU)