POJ 3463 Sightseeing (第k短路)
来源:互联网 发布:网络地板厂家 编辑:程序博客网 时间:2024/06/11 06:00
~~题目链接~~~
题目大意:给出一个旅游路线,现在要求求它的最短路和比最短路长1的路共有多少条。
思路:看代码吧
#include <cstdio>#include <cstring>#define inf 1234567890using namespace std;struct node{ int v, w, next;}edge[10002];struct node2{ int cnt,sum;}dist[1002][4];int n = 0, m = 0, cnt = 0, s = 0, f = 0, sum = 0, us[1002], head[1002], used[1002];void swap(node2 &a, node2 &b){ node2 t = a; a = b; b = t;}void dijkstar(){ int i = 0, j = 0, p = 0, v = 0, w = 0, k = 0, flag = 0, min = 0; dist[0][0].sum = inf; dist[s][0].sum = 0; dist[s][0].cnt = 1; while(1) { k = 0; min = inf; for(i = 1; i<=n; i++)//应该先更新完最短路在的条数在更新次短路, 每回选出当前更新状态的最短距离 { if(us[i] == 0 && dist[i][0].sum<min) { k = i; min = dist[i][0].sum; } else if(us[i] == 1 && dist[i][1].sum<min) { min = dist[i][1].sum; k = i; } } if(k == 0) return ;//表示当前已没有路, 必须要有这个判断, 不然超时 if(k == f && us[k] == 1) return ;//只要一满足这个条件, 终点的最短路与此短路必定统计完了,此时结束 for(p = head[k]; p != -1; p = edge[p].next) { v = edge[p].v; w = edge[p].w; if(us[v]<3 && dist[k][us[k]].sum+w < dist[v][2].sum)//小于第三短路 { dist[v][2].sum = dist[k][us[k]].sum+w; dist[v][2].cnt = dist[k][us[k]].cnt; flag = 0; for(j = 0; j<2; j++)//看这点是否出现过 { if(dist[v][j].sum==dist[v][2].sum) { flag = 1; dist[v][j].cnt += dist[v][2].cnt; dist[v][2].sum = inf; dist[v][2].cnt = 0; break; } } if(!flag)//如果没有出现过,把他更新到正确距离 { for(j = 2; j>0; j--)//调整最短路, 次短路 if(dist[v][j].sum<dist[v][j-1].sum) swap(dist[v][j], dist[v][j-1]); } } } us[k]++; }}int main(){ int i = 0, j = 0, t = 0, u = 0, v = 0, w = 0; scanf("%d", &t); while(t--) { cnt = 0; for(i = 0; i<1002; i++) { head[i] = -1; us[i] = 0; for(j = 0; j<4; j++) { dist[i][j].sum = inf; dist[i][j].cnt = 0; } } scanf("%d %d", &n, &m); for(i = 0; i<m; i++) { scanf("%d %d %d", &u, &v, &w); edge[cnt].v = v; edge[cnt].next = head[u]; edge[cnt].w = w; head[u] = cnt++; } scanf("%d %d", &s, &f); dijkstar(); if(dist[f][1].sum-dist[f][0].sum == 1) printf("%d\n", dist[f][1].cnt+dist[f][0].cnt); else printf("%d\n", dist[f][0].cnt); } return 0;}
- POJ 3463 Sightseeing (第k短路)
- poj 3463 Sightseeing (次短路 )
- POJ 3463 Sightseeing 次短路
- poj 3463 Sightseeing(最短路+次短路)
- poj 3463 Sightseeing(最短路&&次短路)
- poj 3463 Sightseeing(最短路和次短路)
- poj 3463 Sightseeing(最短路次短路)
- POJ 3463 Sightseeing(最短路次短路计数)
- POJ 3463 Sightseeing 最短路+次短路
- POJ 3463 Sightseeing(次短路)转自'wind
- POJ 3463 Sightseeing 次短路条数
- POJ 3463 Sightseeing (次短路,Dijkstra拓展)
- poj-3463-Sightseeing-求次短路
- 【Dijkstra+邻接表求次短路】POJ Sightseeing 3463
- POJ 3463 && HDU 1688 Sightseeing 次短路
- Poj 2449 第k短路
- 【POJ】3463 Sightseeing 最短路+比最短路大一的路(最短路 or 最短路+DP)
- poj 3463 Sightseeing (dij 求最短路和次短路并计数)
- 青春划过指尖
- 为什么程序员不擅长估算时间
- ArcGIS 文件地理数据库的表记录添加、删除
- ofbiz的工具类的介绍
- devExpress之GridView小技巧(四):右键菜单和可用设置
- POJ 3463 Sightseeing (第k短路)
- 第2章 计算机发展及应用
- NHibernate开发环境与配置-NHibernate入门到精通系列2
- Eclipse4.2 eclipse-jee-juno版本害死人啊
- 虚拟机一些设置
- HDU 4056 涂色 并查集
- ascii码及其汉字编码
- 初识 MongoDB
- 体积阴影(Shadow Volumes)生成算法