#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include <iostream>
using namespace std;
const int MAX=25;
const int INF=1<<27;
//graph info.
int n;
int w[MAX][MAX];
//dij info.
int s;
int dist[MAX];
int p[MAX];
bool flag[MAX];
int dest[MAX];//消防站所在顶点
void reversal(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(w[i][j]==-1) w[i][j]=INF;
}
}
for(i=1;i<=n;i++){
for(j=1;j<i;j++){
w[i][j]^=w[j][i]^=w[i][j]^=w[j][i];
}
}
}
void dij(){
int i;
for(i=1;i<=n;i++){ //注:这里最好不要初始化为INF和i/-1,否则出错或者不好写,待总结
dist[i]=w[s][i];
p[i]=s;
}
memset(flag,false,sizeof(flag));
flag[s]=true;
int time=n-1;
while(time--){
//找本次加入S的点cur
int cur;
int minValue=INF;
for(i=1;i<=n;i++){
if(flag[i]==false && dist[i]<minValue){
minValue=dist[i];
cur=i;
}
}
flag[cur]=true;
//更新cur的邻接点
for(i=1;i<=n;i++){
if(flag[i]==false && w[cur][i]<INF && dist[cur]+w[cur][i]<dist[i]){
p[i]=cur;
dist[i]=dist[cur]+w[cur][i];
}
}
}
}
//s: 目的点
void printPath(int i){
printf("%d\t",i);
if(i!=s)
printPath(p[i]);
}
//dest[i]中节点按照dist[dest[i]]升序排列
bool compare(int a,int b){
return dist[a]<dist[b];
}
int main(){
//输入
scanf("%d",&n);
int i,j;
int tempInt=-1;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%d",&w[i][j]);
}
}
scanf("%d",&s);
int pos=1;
while(scanf("%d",&dest[pos])){ //???通用方式
pos++;
char ch=getchar();
if(ch=='\n')
break;
}
pos--;
//dij
reversal();
dij();
//输出
printf("%s\t%s\t%s\t%s\n","Org","Dest","Time","Path");
sort(dest+1,dest+pos+1,compare);
for(i=1;i<=pos;i++){
printf("%d\t%d\t",dest[i],s);
printf("%d\t",dist[dest[i]]);
printPath(dest[i]);
printf("\n");
}
system("pause");
return 0;
}
分享到:
相关推荐
标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...
标题中的“POJ 1789 最小生成树之prim算法”指的是一个在线编程竞赛题目,来源于普林斯顿开放在线课程(POJ)平台。该题目要求参赛者实现Prim算法,这是一种解决图论问题中寻找最小生成树的经典算法。最小生成树是在...
标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...
poj 2763 程序 线段树 LCA 2000MS AC
* 哈夫曼树:哈夫曼树是指解决问题的哈夫曼树算法,如 poj3253。 * 堆:堆是指解决问题的堆算法。 * trie 树:trie 树是指解决问题的 trie 树算法,如 poj2513。 四、简单搜索 简单搜索是指解决问题的简单搜索...
- 记录状态的动态规划:如`poj3254, poj2411`。 这份训练计划不仅涵盖了基础的算法和数据结构,还深入到了更复杂的概念和技巧,如图算法中的差分约束系统、最小费用最大流,以及数据结构中的线段树和RMQ。此外,还...
在本题“POJ 3264”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...
* 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * 树状树组:例如 poj1195、poj3321。 * RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 ...
10. **POJ 2528 线段树.txt**:这是第三个线段树相关的题目,解题报告可能会深入讲解线段树在不同场景下的应用。 通过阅读这些解题报告,你可以学习到各种高级算法的应用,如动态规划、搜索算法、数据结构(如线段...
标题中的“POJ3277.rar_3277 poj_poj3277_多个面积_线段树”是指一个与编程竞赛相关的压缩文件,特别提到了POJ(Problemset Online Judge)的第3277号问题。POJ是一个著名的在线编程竞赛平台,参与者需要解决各种...
- **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...
【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...
【描述】"北大POJ1201-Intervals 解题报告+AC代码" 暗示了解决此问题的策略已经记录在解题报告中,并且通过了POJ的自动测试系统(AC即Accepted),意味着提供的代码是正确且高效的。通常,这样的解题报告会包含对...
如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合...
【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...
【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...
POJ题解 个人写法 线段树每个人都不一样
7. **P2728(最优比率生成树).cpp** - 最优比率生成树问题涉及找到一棵树,使得树中所有边的权值之比的几何平均值最大。这可能涉及到图论和动态规划。 8. **P2486.cpp** - 又一个未提供具体描述的题目,可能需要...
poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...