码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构作业 校园导航问题

时间:2015-11-24 20:11:21      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

校园导航问题(限1 人完成)

设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径).

技术分享

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
using namespace std;
#define TITLE "路径查询系统"
const int MENU_MAIN_COUNT = 4;
const int MAXN = 1001;
const int INF = 0x3f3f3f3f;
bool vis[MAXN];
int pre[MAXN], lowcost[MAXN], ans[MAXN], cnt, q;
int cost[MAXN][MAXN];
int n, m, w;
string s, t, u, v;
map<string, int>mp;
map<int, string>mp2;
void input_road();
void show_road();
void exit_system();
void Dijkstra(int n, int beg) {
    for (int i = 0; i < n; i++) {
        lowcost[i] = INF;
        vis[i] = false;
        pre[i] =-1;
    }
    lowcost[beg] = 0;
    for (int j = 0; j < n; j++) {
        int k = -1;
        int Min = INF;
        for (int i = 0; i < n; i++) {
            if (!vis[i] && lowcost[i] < Min) {
                Min = lowcost[i];
                k = i;
            }
        }
        if (k == -1) break;
        vis[k] = true;
        for (int i = 0; i < n; i++) {
            if (!vis[i] && lowcost[k] + cost[k][i] < lowcost[i]) {
                lowcost[i] = lowcost[k] + cost[k][i];
                pre[i] = k;
            }
        }
    }
}

void init() {
    memset(cost, 0x3f, sizeof(cost));
    cnt = 1;
    q = 0;
    mp.clear();
    mp2.clear();
}

void add(string u) {
    if (!mp[u]) {
        mp[u] = cnt;
        mp2[cnt] = u;
        cnt++;
    }
}

void dfs(int u) {
    if (u == -1) return;
    ans[q++] = u;
    dfs(pre[u]);
}

void print_menu_title(char*title) {
    printf("=================================================\n");
    printf("| %s\n",title);
    printf("-------------------------------------------------\n");
}
char menu_main[]=
    "|\n"
    "| 1  输入路径\n"
    "| 2  查询路径\n"
    "| 3  退出\n"
    "|\n";
void (*menu_main_func[])()=
{
    input_road,
    show_road,
    exit_system
};
void print_menu_main() {
    int selected=0;
    system("cls");
    print_menu_title(TITLE);
    printf(menu_main);
    printf("=================================================\n");
    while(!(selected>=1&&selected<=MENU_MAIN_COUNT))
    {
        printf(">请选择:");
        scanf("%d",&selected);
        if(selected>=1&&selected<=MENU_MAIN_COUNT)
        {
            break;
        }
        printf("\n>输入错误!(请选择1 - %d)\n",MENU_MAIN_COUNT);
    }
    menu_main_func[selected-1]();
}
void input_road() {
    cout << "| 输入建筑数量 " << ‘ ‘ << " 输入路的数量 " << endl;
    cin >> n >> m;
    init();
    cout << "| 输入起点 " << endl;
    cin >> s; add(s);
    cout << "| 输入终点 " << endl;
    cin >> t; add(t);
    cout << "| 输出" << m << "条边的两个端点和长度 " << endl;
    for (int i = 0; i < m; i++) {
        cin >> u >> v >> w;
        add(u);  add(v);
        cost[mp[u]][mp[v]] = min(cost[mp[u]][mp[v]], w);
        cost[mp[v]][mp[u]] = cost[mp[u]][mp[v]];
    }
    print_menu_main();
}

void show_road() {
        Dijkstra(n+1, mp[s]);
        cout << "| 最短路径长度为:" << lowcost[mp[t]] << endl;
        dfs(mp[t]);
        cout << "| 路线为:" <<"         "<< mp2[ans[q-1]];
        for (int i = q-2; i >= 0; i--)
            cout << "->" << mp2[ans[i]];
        cout << endl;
        getchar();
        getchar();
        cout << "按任意键退出" << endl;
        print_menu_main();
}
void exit_system() {
    exit(0);
}

int main(){
    print_menu_main();
    return 0;
}

 

数据结构作业 校园导航问题

标签:

原文地址:http://www.cnblogs.com/cheater/p/4992503.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!