当前位置:编程学习 > C/C++ >>

HDU 4522 最短路

题目描述:给出列车的行驶路径,和每个路径是硬座还是软卧,并且给出硬座和软卧的不舒适度,求从起点到终点最小的不舒适度。

思路:首先分别求出硬座和软卧从起点到终点的距离,最后比较不舒适度,当然这题得建2个图,一个是硬座的路径,一个是软卧的路径,得注意的是,当K= 1时,是硬座软卧都有,所以两边都得加进去。

其他的没什么,就是最基础的最短路。比赛的时候没有好好看题=。=


[cpp]
#include <iostream>  
#include <cstdio>  
#include <algorithm>  
#include <string>  
#include <cmath>  
#include <cstring>  
#include <queue>  
#include <set>  
#include <vector>  
#include <stack>  
#include <map>  
#include <iomanip>  
#define PI acos(-1.0)  
#define Max 2005  
#define inf 1<<28  
#define LL(x) (x<<1)  
#define RR(x) (x<<1|1)  
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)  
#define ll long long  
#define mem(a,b) memset(a,b,sizeof(a))  
#define mp(a,b) make_pair(a,b)  
using namespace std; 
 
int head[2][500]; 
struct kdq 

    int s,e,next; 
} edge[2][2000]; 
int num[2]  ; 
bool vis[2][500]; 
void add(int s,int e,int k ) 

    edge[k][num[k]].e = e; 
    edge[k][num[k]].next = head[k][s]; 
    head[k][s] = num[k] ++; 

void init() 

    mem(head,-1); 
    mem(vis,0); 
    num[0] = num[1] = 0 ; 

char a[10005]; 
int StringToInt(string x) 

    int l = x.size(); 
    int num = 0; 
    for (int i = l - 1 ; i >= 0 ; i --) 
    { 
        num += (x[i] - '0') * pow(10.0,(double)(l - i - 1)); 
    } 
    return num ; 

int dis[2][500]; 
int n ; 
#define x first  
#define y second  
int spfa(int s,int e,int k) 

    for (int i = 0 ;i <= n ; i ++)dis[k][i] = inf; 
    dis[k][s] = 0; 
    vis[k][s] = 1; 
    queue<pair<int,int> >q; 
    q.push(mp(s,0)); 
    while(!q.empty()) 
    { 
        int temp = q.front().x; 
        int step = q.front().y; 
        q.pop(); 
        vis[k][temp] = 0; 
        if(temp == e) 
        return step ; 
        for (int i = head[k][temp] ; i != -1 ;i = edge[k][i].next) 
        { 
            int tt = edge[k][i].e; 
            if(dis[k][tt] > dis[k][temp] + 1) 
            { 
                dis[k][tt] = dis[k][temp] + 1; 
                if(!vis[k][tt]) 
                { 
                    vis[k][tt] = 1; 
                    q.push(mp(tt,step + 1)); 
                } 
            } 
        } 
    } 
    return -1; 

int main() 

    int T; 
    cin >> T; 
    while ( T -- ) 
    { 
        int  m ; 
        cin >> n >> m; 
        init(); 
        while ( m -- ) 
        { 
            scanf("%s",a); 
            int k ; 
            cin >> k; 
            int l = strlen(a); 
            string x ; 
            x.clear(); 
            vector<int>q; 
            for (int i = 0 ; i < l ; i ++) 
            { 
                if(a[i] == '+') 
                { 
                    q.push_back(StringToInt(x)); 
                    x.clear(); 
                } 
                else 
                    x += a[i]; 
            } 
            q.push_back(StringToInt(x)); 
            l = q.size(); 
            for (int j = 0 ; j <= k ; j ++)//当k = 1 时, 硬座和软卧都要加入该路径。  
                for (int i = 1 ; i < l ; i ++) 
                { 
                    a

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,