Uva 11374 Airpot Express

坑爹啊 INF开大了要错,还没有PE

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;

const int MAXN = 1007;
const int INF = 1 << 27;
struct Edge {
	int from, to, dist;
	Edge() {}
	Edge(int from, int to, int dist):from(from), to(to), dist(dist) {}
};
struct HeapNode {
	int d, u;
	HeapNode(int d, int u):d(d), u(u) {}
	bool operator < (const HeapNode & hn) const {
		return d > hn.d;
	}
};
struct Dijkstra {
	int n, m;
	vector<Edge> edges;
	vector<int> G[MAXN];
	bool done[MAXN];
	int d[MAXN];
	int p[MAXN];
	void init(int n) {
		this->n = n;
		for(int i = 1; i <= n; i++) G[i].clear();
		edges.clear();
	}
	void addedge(int u, int v, int d) {
		edges.push_back( Edge(u, v, d) );
		G[u].push_back( edges.size() - 1);
	}
	void dijkstra(int s) {
		memset(done, 0, sizeof(done));
		for(int i = 1; i <= n; i++) d[i] = INF;
		priority_queue<HeapNode> pq;
		pq.push(HeapNode(0, s));
		d[s] = 0;
		p[s] = -1;
		while( !pq.empty()) {
			HeapNode u = pq.top(); pq.pop();
			if(done[u.u]) continue;
			done[u.u] = true;
			int i, sz = G[u.u].size();
			for(i = 0; i < sz; i++) {
				Edge v = edges[G[u.u][i]];
				if(d[v.to] > d[u.u] + v.dist) {
					d[v.to] = d[u.u] + v.dist;
					p[v.to] = u.u;
					pq.push( HeapNode(d[v.to], v.to));
				}
			}
		}
	}
}Dijk;
Edge Eg[MAXN];
int dA[MAXN], dB[MAXN];
int pA[MAXN], pB[MAXN];

int main() {
	int n, s, e, id = 0;
	while(~scanf("%d%d%d", &n, &s, &e)) {
		Dijk.init(n);
		int i, u, v, d, k;
		scanf("%d", &k);
		for(i = 0; i < k; i++) {
			scanf("%d%d%d", &u, &v, &d);
			Dijk.addedge(u, v, d);
			Dijk.addedge(v, u, d);
		}
		scanf("%d", &k);
		for(i = 0; i < k; i++) scanf("%d%d%d", &Eg[i].from, &Eg[i].to, &Eg[i].dist);
		Dijk.dijkstra(s);
		for(i = 1; i <= n; i++) {
			dA[i] = Dijk.d[i];
			pA[i] = Dijk.p[i];
		}
		Dijk.dijkstra(e);
		for(i = 1; i <= n; i++) {
			dB[i] = Dijk.d[i];
			pB[i] = Dijk.p[i];
		}

		int ans = dA[e], te = e, tt;
		bool noused = true;
		for(i = 0; i < k; i++) {
			int tmp = dA[Eg[i].from] + dB[Eg[i].to] + Eg[i].dist;
			if( tmp < ans) {
				ans = tmp;
				noused = false;
				te = Eg[i].from;
				tt = Eg[i].to;
			}
			tmp = dA[Eg[i].to] + dB[Eg[i].from] + Eg[i].dist;
			if(tmp < ans) {
				ans = tmp;
				noused = false;
				te = Eg[i].to;
				tt = Eg[i].from;
			}
		}
		if(id++) puts("");
		int ttt = te;
		stack<int> path;
		while(te != -1) {
			path.push(te);
			te = pA[te];
		}
		printf("%d", path.top());
		path.pop();
		while( !path.empty()) {
			printf(" %d", path.top());
			path.pop();
		}
		if( !noused) {
			te = tt;
			while(te != -1) {
				printf(" %d", te);
				te = pB[te];
			}
			printf("\n%d\n", ttt);
		}
		else puts("\nTicket Not Used");
		printf("%d\n", ans);
	}
	return 0;
}


今天向大家介绍一款非常好用的单机版OCR图文识别软件,它不仅功能多,识别能力强,而且还是免费使用的。OCR软件为什么要使用单机版,懂得都懂,因为如果使用在线识别的OCR软件,用户需要将文档上传互联网服务器的,这样就会导致某些敏感信息暴露在互联网上,导致信息泄露。 软件特色:   1、识别率高、速度快:对于被划分区域内的文字有很高的识别率,而且速度同样很快。   2、导出功能:清华TH-OCR官方版可以将带有表格的文当导出成为RTF格式的文件,从而允许用户在Word等应用程序中继续进行编辑。   3、版面自动分析:对图文混排的文件具有版面自动分析功能,它自动对扫描的版面进行分析,把应识别的文字区域划分出来,之后进行识别。   4、转换图像格式:将扫描进来的图像格式转换成TIFF、BMP或PCZ等格式,具有很大的灵活性。   5、批量识别:可以让用户一次把多页文稿全部扫描之后再进行识别,避免了扫描一页识别一页带来的麻烦,这一版本最多可实现10000页的批量识别。   6、手写体识别:手写的信件或文件就可以扫描到计算机中,识别出来后用电子文档的方式进行保存。   7、自学习:当遇到有生僻字时,可以通过键盘输入进行学习,用户就可以自由地添加一些本来不“认识”的字,大大拓宽了中文OCR系统的识别字符集。   8、排版功能:汉字和英文混排、日文和英文混排、韩文和英文混排同时识别。   9、识别能力:是唯一可以识别2万多汉字的多体文字识别系统,汉字识别国内最优。   10、支持多接口:文通TH-OCR支持WINDOWS环境和GB、BIG5、GBK、JIS、 SHIFT-JIS和KSC等多种内码,适合全球各个地区使用。TH-OCR还具有自学习功能,不论什么生僻字,都可以通过键盘输入进行学习,大大拓宽了OCR系统的识别字符集。
内容概要:本文详细介绍了Tarjan算法及其在求解有向图强连通分量(SCC)中的应用。首先解释了连通性的概念,区分了无向图和有向图的连通分量,重点阐述了有向图中强连通分量的定义及其重要性,包括编译器优化、社交网络分析、电子电路设计和生态系统建模等领域。接着介绍了Tarjan算法的优势,如单次DFS遍历、线性时间复杂度和高效的空间利用。文章深入解析了算法的实现细节,包括发现时间数组、最低访问数组、栈状态标记和栈等数据结构的作用。最后,探讨了基于Tarjan算法的拓展应用,如图的缩点技术和2-SAT问题求解,展示了其在依赖关系分析、路径优化、控制流分析和任务调度等方面的应用。 适合人群:具备一定图论基础和编程经验的计算机科学专业学生、软件工程师以及从事算法研究和开发的技术人员。 使用场景及目标:①理解Tarjan算法的工作原理,掌握其在强连通分量识别中的具体实现;②学习如何通过缩点技术将复杂有向图简化为DAG,以优化路径计算和依赖分析;③掌握2-SAT问题的求解方法,提高对布尔可满足性问题的理解和处理能力。 阅读建议:本文内容较为深入,建议读者先熟悉图论基础知识,特别是深度优先搜索(DFS)的相关概念。在学习过程中,结合具体的例子和代码实现,逐步理解各个数据结构和算法步骤的作用,同时关注Tarjan算法在实际应用中的拓展和变种。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值