• ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))


    这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间。


    ZOJ1791(POJ1613)-Cave Raider

    //限制行走时间的最短路
    //POJ1613-ZOJ1791
    //Time:16Ms	Memory:324K
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    #define MAX	505
    #define MAXT 55
    #define MAXS MAXT*3
    #define INF 0x3f3f3f3f
    
    struct Edge {
    	int u, v, w;
    	int t[MAXT], lt;	//lt:开启与关闭时间点总和
    }e[MAX];
    
    int n, m, s, t;
    int d[MAXT];
    
    void bellman_ford()
    {
    	memset(d, 0x3f, sizeof(d));
    	d[s] = 0;
    	for (int i = 1; i <= n; i++)
    		for (int j = 0; j < m; j++)
    			for (int k = 1; k <= e[j].lt; k += 2)
    			{
    				int u = e[j].u, v = e[j].v;
    				//tu:从u出发到v的时间
    				int tu = max(d[u], e[j].t[k - 1]) + e[j].w;
    				int tv = max(d[v], e[j].t[k - 1]) + e[j].w;
    				if (tu <= e[j].t[k] || tv <= e[j].t[k])	//几次WA是因为没有取'='
    				{
    					if (tv <= e[j].t[k]) d[u] = min(d[u], tv);
    					if (tu <= e[j].t[k]) d[v] = min(d[v], tu);
    					break;
    				}
    			}
    }
    
    int main()
    {
    	char str[MAXS];
    	while (scanf("%d", &n), n)
    	{
    		memset(e, 0, sizeof(e));
    		scanf("%d%d%d", &m, &s, &t);
    		for (int i = 0; i < m; i++)
    		{
    			scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
    			e[i].lt = 1;
    			cin.getline(str, MAXS);
    			int len = strlen(str);
    			for (int j = 0; j < len; j++)
    			{
    				bool flag = false;	//有无数值
    				while (str[j] >= '0' && str[j] <= '9')
    				{
    					e[i].t[e[i].lt] = e[i].t[e[i].lt] * 10 + str[j++] - '0';
    					flag = true;	//已记录数值
    				}
    				if (flag)	e[i].lt++;
    			}
    			e[i].t[e[i].lt] = INF;	//偶数时当做+∞,奇数时无用
    		}
    
    		bellman_ford();
    		if (d[t] == INF) printf("*
    ");
    		else	printf("%d
    ", d[t]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    linux服务器安装nginx及使用
    服务器搭建
    Linux安装mysql5.7
    个人服务器的选择
    DECODE函数简介
    ORACLE数据库优化
    Mac下JD-GUI无法使用
    Qt 中QString 字符串操作:连接、组合、替换、去掉空白字符
    [Qt初级] 解决 中QMainWindow和QDockWidget添加布局失败问题
    我的JS 中级学习篇
  • 原文地址:https://www.cnblogs.com/Inkblots/p/5472263.html
Copyright © 2020-2023  润新知