zoukankan      html  css  js  c++  java
  • A1111 Online Map [dj+dfs]

    **加粗样式
    思路:用两个Dijkstra。一个求最短路径(如果相同求时间最短的那条),一个求最快路径(如果相同求结点数最小的那条)
    数组记录结点,dfs遍历输出结点

    #include<iostream>
    #include<vector>
    #include<map>
    #include<string>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn = 501;
    const int inf = 999999999;
    int dis[501], Time[501], d[501][501], T[501][501], dispre[501], timepre[501], t1[501], nodenum[501];
    bool visit[501];
    int st, ed;
    vector<int>shortpath, quickpath, temppath;
    void dfs_shortpath(int v)
    {
    	shortpath.push_back(v);
    	if (v == st) return;
    	dfs_shortpath(dispre[v]);
    }
    void dfs_quickpath(int v)
    {
    	quickpath.push_back(v);
    	if (v == st) return;
    	dfs_quickpath(timepre[v]);
    }
    int main()
    {
    	fill(dis, dis + 501, inf);
    	fill(Time, Time + 501, inf);
    	fill(t1, t1 + 501, inf);
    	fill(d[0], d[0] + 501 * 501, inf);
    	fill(T[0], T[0] + 501 * 501, inf);
    	int n, m;
    	cin >> n >> m;
    	int a, b, flag, len, t;
    	for (int i = 0; i < m; i++)
    	{
    		cin >> a >> b >> flag >> len >> t;
    		d[a][b] = len;
    		T[a][b] = t;
    		if (flag != 1)
    		{
    			d[b][a] = len;
    			T[b][a] = t;
    		}
    	}
    	cin >> st >> ed;
    	dis[st] = 0;
    	for (int i = 0; i < n; i++)
    	{
    		int u = -1, min = inf;
    		for (int j = 0; j < n; j++)
    		{
    			if (visit[j] == false && dis[j] < min)
    			{
    				u = j;
    				min = dis[j];
    			}
    		}
    		if (u == -1) break;
    		visit[u] = true;
    		for (int v = 0; v < n; v++)
    		{
    			if (visit[v] == false)
    			{
    				if (d[u][v] + dis[u] < dis[v])
    				{
    					dis[v] = d[u][v] + dis[u];
    					dispre[v] = u;
    					t1[v] = T[u][v] + t1[u];
    				}
    				else if (d[u][v] + dis[u] == dis[v] && t1[v] > T[u][v] + t1[u])
    				{
    					dispre[v] = u;
    					t1[v] = T[u][v] + t1[u];
    				}
    			}
    		}
    	}
    	dfs_shortpath(ed);
    	Time[st] = 0;
    	fill(visit, visit + 501, false);
    	for (int i = 0; i < n; i++)
    	{
    		int u = -1, min = inf;
    		for (int j = 0; j < n; j++)
    		{
    			if (visit[j] == false && Time[j] < min)
    			{
    				u = j;
    				min = Time[j];
    			}
    		}
    		if (u == -1) break;
    		visit[u] = true;
    		for (int v = 0; v < n; v++)
    		{
    			if (visit[v] == false)
    			{
    				if (T[u][v] + Time[u] < Time[v])
    				{
    					Time[v] = T[u][v] + Time[u];
    					timepre[v] = u;
    					nodenum[v] = nodenum[u] + 1;
    				}
    				else if (Time[v] == T[u][v] + Time[u]&&nodenum[u]+1<nodenum[v])
    				{
    					timepre[v] = u;
    					nodenum[v] = nodenum[u] + 1;
    				}
    			}
    		}
    	}
    	dfs_quickpath(ed);
    	printf("Distance = %d", dis[ed]);
    	if (shortpath == quickpath) 
    	{
    		printf("; Time = %d: ", Time[ed]);
    	}
    	else {
    		printf(": ");
    		for (int i = shortpath.size() - 1; i >= 0; i--) {
    			printf("%d", shortpath[i]);
    			if (i != 0) printf(" -> ");
    		}
    		printf("
    Time = %d: ", Time[ed]);
    	}
    	for (int i = quickpath.size() - 1; i >= 0; i--) {
    		printf("%d", quickpath[i]);
    		if (i != 0) printf(" -> ");
    	}
    	return 0;
    
    }
    
    
  • 相关阅读:
    Re: 求助:5道算法题
    AutoComplete的字典建立和单词查找算法实现
    求教大牛!关于后缀树
    Qt OpenGL教程
    调试宏
    if结合errorlevel使用:判断一个DOS命令执行成功与否
    写给自己,关于对纯技术的追求,以及为了金钱与前途的技术追求
    <转>我对菜鸟成长的看法
    看完电影有感。。。。。
    <转>标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13811978.html
Copyright © 2011-2022 走看看