• 51NOD 1459 迷宫游戏


    给定一个图, 起点以及终点, 每一条边有两个参数 (dis) , 每个点有一个参数 (v) 求在保证最短路以及最短路情况下的最大 (sum v)

    Solution

    看了直播水一发
    这是一个多关键字的最短路(不过第二关键字为点权)
    那就算复习最短路啦
    其做法是跑最短路, 在得到相同最短路长度的时候更新到此点最大 (v)
    然而这题有一个说法: 每个点权只能取得一次
    因为边权全部为正, 不存在负环, 因此一个点不可能经过两次
    故正确性得到确认

    Code

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    using namespace std;
    int RD(){
        int out = 0,flag = 1;char c = getchar();
        while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
        while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
        return flag * out;
        }
    const int maxn = 100019,INF = 1e9 + 19;
    int head[maxn],nume = 1;
    struct Node{
        int v,dis,nxt;
        }E[maxn << 3];
    void add(int u,int v,int dis){
        E[++nume].nxt = head[u];
        E[nume].v = v;
        E[nume].dis = dis;
        head[u] = nume;
        }
    int num, nr, s, t;
    int d[maxn], val[maxn], ori[maxn];
    bool inq[maxn];
    void SPFA(int s){
    	for(int i = 0;i <= num;i++)d[i] = INF;
    	queue<int>Q;
    	d[s] = 0, val[s] = ori[s];
    	Q.push(s);
    	inq[s] = 1;
    	while(!Q.empty()){
    		int u = Q.front();Q.pop();inq[u] = 0;
    		for(int i = head[u];i;i = E[i].nxt){
    			int v = E[i].v, dis = E[i].dis;
    			if(d[u] + dis < d[v]){
    				d[v] = d[u] + dis;
    				val[v] = val[u] + ori[v];
    				if(!inq[v])Q.push(v), inq[v] = 1;
    				}
    			else if(d[u] + dis == d[v]){
    				val[v] = max(val[v], val[u] + ori[v]);
    				}
    			}
    		}
    	}
    int main(){
    	num = RD(), nr = RD(), s = RD(), t = RD();
    	for(int i = 0;i < num;i++)ori[i] = RD();
    	for(int i = 1;i <= nr;i++){
    		int u = RD(), v  = RD(), dis = RD();
    		add(u, v, dis), add(v, u, dis);
    		}
    	SPFA(s);
    	printf("%d %d
    ", d[t], val[t]);
    	return 0;
    	}
    
  • 相关阅读:
    各种算法七
    各种算法六
    使用URLConnection调用axis1.4开发的webservice
    JDBC结果集rs.next()注意事项
    URLConnection调用接口
    axis1.4开发webservice客户端(快速入门)-基于jdk1.4
    axis1.4开发webservice服务端(快速入门)-基于jdk1.4
    FMDB数据库的简单实用
    Xcode5 取消项目ARC,或者单个类ARC切换
    用CornerStone配置SVN,HTTP及svn简单使用说明
  • 原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9593980.html
Copyright © 2020-2023  润新知