Two dijkstra template title

// hdu2112 map by mapping the node numbers

// link http://acm.hdu.edu.cn/showproblem.php?pid=2112

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 150 + 15;

string s, e;
map<string, int> discnt;

int cnt;
int G[MAXN][MAXN];

int dis[MAXN];
int screws [MAXN];
void dijkstra() {
    if(s == e) {
        printf("0\n");
        return ;
    }
    for(int i = 0; i != cnt; ++i) {
        dis[i] = G[discnt[s]][i];
        view [i] = 0;
    }
    vis[discnt[s]] = 1;
    for(int i = 0; i != cnt-1; ++i) {
        you from = INF;
        int t = -1;
        for(int j = 0; j != cnt; ++j) {
            if(!vis[j] && dis[j] < minn) {
                by dis = [j];
                t = j;
            }
        }
        if(t == -1) break;
        force [i] = 1;
        for(int j = 0; j != cnt; ++j) {
            if(dis[j] > dis[t]+G[t][j]) {
                tell [j] = say [t] + G [t] [j];
            }
        }
    }
    if(dis[discnt[e]] != INF) printf("%d\n", dis[discnt[e]]);
    else printf("-1\n");
}

int main () {
    int n;
    while(scanf("%d", &n) == 1 && n != -1) {
        memset(G, INF, sizeof(G));
        cin >> s >> e;
        string a, b;
        discnt.clear();
        cnt = 0;
        discnt[a] = ++cnt;
        discnt[b] = ++cnt;
        int c;
        for(int i = 0; i != n; ++i) {
            cin >> a >> b >> c;
            if(!discnt.count(a)) discnt[a] = cnt++;
            if(!discnt.count(b)) discnt[b] = cnt++;
            if(c < G[discnt[a]][discnt[b]]) {
                G[discnt[a]][discnt[b]] = G[discnt[b]][discnt[a]] = c;
            }
        }
        dijkstra();
    }
    return 0;
}
 
//------------------split line---------------------------- -------------------- 
 
// PAT (Advanced Level) Practice-> 1030 record path
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

#define INF 0x3f3f3f3f
#define MAX 502
int N, M, S, D;
int mp[MAX][MAX], cost[MAX][MAX];
int path[MAX], vis[MAX];
int dis[MAX], mincost[MAX];

void Dijkstar(){
    for(int i = 0; i != N; ++i){
        dis[i] = mp[S][i];
        mincost[i] = cost[S][i];
        path [i] = S; // is recorded on a node
    }
    to [S] = 1;
    for(int i = 0; i < N-1; ++i){
        INT M = inf, m_c = inf;
        int t;
        for(int j = 0; j != N; ++j){
            if(!vis[j] && m > dis[j]){
                say m = [j];
                m_c = mincost[j];
                t = j;
            }
        }
        force [i] = 1;
        for(int j = 0; j != N; ++j){
            if(!vis[j]){
                if(dis[j] > mp[t][j] + m){
                    dis[j] = mp[t][j] + m;
                    mincost[j] = cost[t][j] + m_c;
                    path[j] = t;
                }
                else if(dis[j] == mp[t][j] + m && mincost[j] > cost[t][j] + m_c){
                    dis[j] = mp[t][j] + m;
                    mincost[j] = cost[t][j] + m_c;
                    path[j] = t;
                }
            }
        }
    }
    int index = D, top = 0;
    int stack[MAX];
    while(index != S){
        stack[top++] = index;
        index = path[index];
    }
    cout << S << " ";
    top--;
    while(top >=0){
        cout << stack[top--] << " ";
    }
    cout << dis[D] << " " << mincost[D] << endl;
}

int main ()
{
    cin >> N >> M >> S >> D;
    memset(mp, 0x3f, sizeof(mp));
    memset(cost, 0x3f, sizeof(cost));
    memset(vis, 0, sizeof(vis));
    int a, b, s, c;
    for(int i = 0; i != M; ++i){
        scanf("%d%d%d%d", &a, &b, &s, &c);
        if(s < mp[a][b] || (s == mp[a][b] && c < cost[a][b])){
            mp [a] [b] = mp [b] [a] = s;
            cost[a][b] = cost[b][a] = c;
        }
    }
    Dijk Star ();
    return 0;
}

Guess you like

Origin www.cnblogs.com/pupil-xj/p/11564176.html