`

POJ1122 记录前驱树Dij

 
阅读更多
#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 最小生成树

    标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...

    POJ 1751 求最小生成树prim算法(JAVA)

    标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...

    POJ 1789 最小生成树之prim算法

    标题中的“POJ 1789 最小生成树之prim算法”指的是一个在线编程竞赛题目,来源于普林斯顿开放在线课程(POJ)平台。该题目要求参赛者实现Prim算法,这是一种解决图论问题中寻找最小生成树的经典算法。最小生成树是在...

    字典树练习 POJ 1056

    标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...

    poj 2763 housewife Wind

    poj 2763 程序 线段树 LCA 2000MS AC

    POJ算法题目分类

    * 哈夫曼树:哈夫曼树是指解决问题的哈夫曼树算法,如 poj3253。 * 堆:堆是指解决问题的堆算法。 * trie 树:trie 树是指解决问题的 trie 树算法,如 poj2513。 四、简单搜索 简单搜索是指解决问题的简单搜索...

    poj训练计划.doc

    - 记录状态的动态规划:如`poj3254, poj2411`。 这份训练计划不仅涵盖了基础的算法和数据结构,还深入到了更复杂的概念和技巧,如图算法中的差分约束系统、最小费用最大流,以及数据结构中的线段树和RMQ。此外,还...

    线段树练习POJ 3264

    在本题“POJ 3264”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...

    poj题目分类

    * 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * 树状树组:例如 poj1195、poj3321。 * RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 ...

    POJ 部分题解 解题报告

    10. **POJ 2528 线段树.txt**:这是第三个线段树相关的题目,解题报告可能会深入讲解线段树在不同场景下的应用。 通过阅读这些解题报告,你可以学习到各种高级算法的应用,如动态规划、搜索算法、数据结构(如线段...

    POJ3277.rar_3277 poj_poj3277_多个面积_线段树

    标题中的“POJ3277.rar_3277 poj_poj3277_多个面积_线段树”是指一个与编程竞赛相关的压缩文件,特别提到了POJ(Problemset Online Judge)的第3277号问题。POJ是一个著名的在线编程竞赛平台,参与者需要解决各种...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ1201-Intervals

    【描述】"北大POJ1201-Intervals 解题报告+AC代码" 暗示了解决此问题的策略已经记录在解题报告中,并且通过了POJ的自动测试系统(AC即Accepted),意味着提供的代码是正确且高效的。通常,这样的解题报告会包含对...

    poj各种分类

    如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 快速排序、归并排序和堆排序等,不仅用于排序,也常用于解决与逆序数相关的问题,如poj2388。 #### 并查集 用于处理集合...

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    POJ2777 个人代码

    POJ题解 个人写法 线段树每个人都不一样

    Poj中的一些题目源代码

    7. **P2728(最优比率生成树).cpp** - 最优比率生成树问题涉及找到一棵树,使得树中所有边的权值之比的几何平均值最大。这可能涉及到图论和动态规划。 8. **P2486.cpp** - 又一个未提供具体描述的题目,可能需要...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

Global site tag (gtag.js) - Google Analytics