题目链接:

 Hdu 4725 The Shortest Path in Nya Graph

题目描述:

  有n个点,m条边,每经过路i需要wi元。并且每一个点都有自己所在的层。一个点都乡里的层需要花费c元,问从1到N最小花费?

解题思路:

  建图比较楠,刚开始的时候想到拆点,把一个点拆成两个,N+i表示点i所在层,对每个点对自己所在层建双向边,权值为0。 然后相邻层建双向边,权值为c。对w条点之间的边,正常建。但是写出来样例都GG了。发现对于同一层的点,在我建的图中可以免费来回跑,这样好像和题意有些不符。最后把一个点拆成三个点(实际点,所在层入口,所在层出口),实际点向出口和入口建单向边,权值为0。上一层出口向相邻层入口建单向边,权值为c。上一层入口向相邻层出口口建单向边,权值为c。然后用经过优先队列优化的spfa才能过,要不然还是GG。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include <queue>
using namespace std; #define LL __int64
const int maxn = ;
const int INF = 1e9+; struct node1
{
int u;
int d;
bool operator < (const node1 &rhs)const
{
return d > rhs.d;
}
}; struct node
{
int to, next, w;
} edge[maxn*]; int head[maxn], tot, n, c, m;
int dist[maxn]; void init ()
{
tot = ;
memset (head, -, sizeof(head));
} void add (int from, int to, int w)
{
edge[tot].w = w;
edge[tot].to = to;
edge[tot].next = head[from];
head[from] = tot ++;
} int dijkstra ()
{ for (int i=; i<=*n; i++)
dist[i] = INF; node1 p, q;
priority_queue <node1> Q;
p.d = , p.u = ;
Q.push(p);
dist[] = ; while (!Q.empty())
{
p = Q.top();
Q.pop();
if (p.u == n)
return dist[n]; for (int i=head[p.u]; i!=-; i=edge[i].next)
{
q.u = edge[i].to;
q.d = edge[i].w; if (dist[q.u] > dist[p.u] + q.d)
{
dist[q.u] = dist[p.u] + q.d;
q.d = dist[q.u];
Q.push (q);
}
}
}
return -;
} int main ()
{
int T, l = ;
scanf ("%d", &T);
while (T --)
{
init ();
scanf ("%d %d %d", &n, &m, &c);
for (int i=; i<=n; i++)
{
int layer;
scanf ("%d", &layer); add (i, *layer+n-, );
add (*layer+n, i, );
} for (int i=; i<=n; i++)
{
add (*(i-)+n-, *i+n, c);
add (*i+n-, *(i-)+n, c);
} for (int i=; i<m; i++)
{
int u, v, w;
scanf ("%d %d %d", &u, &v, &w); add (u, v, w);
add (v, u, w);
} printf ("Case #%d: %d\n", ++l, dijkstra());
}
return ;
}

最新文章

  1. 412. Fizz Buzz
  2. equals(),hashcode(),克隆学习心得
  3. javascript unit testing
  4. [ACM_模拟] UVA 10881 Piotr&#39;s Ants[蚂蚁移动 数组映射 排序技巧]
  5. malloc钩子和内存泄漏工具mtrace、Valgrind
  6. VIM配置相关记录
  7. POJ - 2041Unreliable Message
  8. [转]在Linux里设置环境变量的方法
  9. Python javascript操作DOM
  10. JAVA高并发
  11. matlab函数int2str, num2str, str2num
  12. Filebeat使用内置的mysql模块收集日志存储到ES集群并使用kibana存储
  13. Installing Apache Hadoop Single Node
  14. POJ-1191-棋盘分割(动态规划)
  15. 『科学计算』L0、L1与L2范数_理解
  16. 730. Count Different Palindromic Subsequences
  17. range循环
  18. Python ImportError: No module named Image
  19. poj2409:Let it Bead(置换群 polya定理)
  20. linux的%用法

热门文章

  1. java使用默认线程池踩过的坑(三)
  2. 初解C#类、结构、弱引用
  3. Appium,IOS 模拟器,Java工程搭建
  4. 利用easyUI的combobox打造自己主动提示组件
  5. Anaconda和Pycharm安装和配置教程
  6. 利用BADI WORKORDER_INFOSYSTEM在COOIS中加入自己定义列办事处
  7. CentOS笔记-常用网络命令
  8. Linux 常用命令 (备忘)
  9. 为什么java web项目中要使用spring
  10. HDOJ 5045 Contest