kuangbin_ShortPathN (POJ 1847)

提出了一个错误的算法 以为能优化到只运行两次dij

然而我还是too naive 还是乖乖dij n 次吧...

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#define INF 0x3F3F3F3F
using namespace std;

typedef pair<int, int> pii;
struct cmp{
    bool operator () (const pii a, const pii b){
        return a.first > b.first;
    }
};

int map[110][110], val[110][110], lev[110];
int m, n;

int dij()
{
    int  dist[110];
    priority_queue<pii, vector<pii>, cmp> q;
    memset(dist, 0x3f, sizeof dist);
    dist[0] = 0;
    q.push(make_pair(0, 0));
    while(!q.empty()){
        pii u = q.top();
        q.pop();
        if(u.first > dist[u.second]) continue;
        for(int i = 1; i <= n; i++){
            if(dist[i] > dist[u.second] + val[u.second][i]){
                dist[i] = dist[u.second] + val[u.second][i];
                q.push(make_pair(dist[i], i));
            }
        }
    }
    return dist[1];
}

int main()
{
    memset(map, 0x3f, sizeof val);
    scanf("%d%d", &m, &n);
    for(int i = 1; i <= n; i++){
        int x, y, p;
        scanf("%d%d%d", &map[0][i], &lev[i], &x);
        while(x--){
            scanf("%d%d", &y, &p);
            map[y][i] = p;
        }
    }
    int ans = INF;
    for(int i = 0; i <= m; i++){
        memset(val, 0x3f, sizeof val);
        for(int x = 0 ; x <= n; x++){
            if(x == 0 || (lev[x] >= lev[1] - m + i && lev[x] <= lev[1] + i)){
                for(int y = 1; y <= n; y++){
                    if(lev[y] >= lev[1] - m + i && lev[y] <= lev[1] + i){
                        val[x][y] = map[x][y];
                    }
                }
            }
        }
        ans = min(dij(), ans);
        //printf("%d ~ %d : %d\n", lev[1] - m + i, lev[1] + i, ans);
    }
    printf("%d\n", ans);
    return 0;
}
时间: 2024-10-13 10:35:39

kuangbin_ShortPathN (POJ 1847)的相关文章

poj 1847 最短路简单题,dijkstra

1.poj  1847  Tram   最短路 2.总结:用dijkstra做的,算出a到其它各个点要改向的次数.其它应该也可以. 题意: 有点难懂.n个结点,每个点可通向ki个相邻点,默认指向第一个相邻点,可以改变指向.求一条从A到B的路,使用最少改变路上点的指向的次数. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm>

POJ 1847 Tram 单源最短路径

题意:轨道网,有若干转换器,每个转换器都和其他若干转换器相连,转换器初始指向第一个与其相连的转换器.问要到达终点需要最少转换多少次? 思路:可以用dijkstra单源最短路来做,把轨道网看做有向图(因为1第一个指向2,2的第一个不一定指向1),当前转换器处始指向的那个转换器之间的路径权值为0,其他路径权值为1,求一次起点到终点的最短路,结果就是最少转换次数,注意可能没有路径,这时要输出-1 代码: /* poj 1847 264K 0MS */ #include<cstdio> #includ

POJ 1847 Tram 【最短路,spfa算法,题意理解是关键呀!!】

Tram Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13468   Accepted: 4954 Description Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch pointing to t

poj 1847( floyd &amp;&amp; spfa )

http://poj.org/problem?id=1847 一个水题,用来熟悉熟悉spfa和floyd的. 题意:有m条的铁路,要从x,到y, 之后分别就是条铁路与其他铁路的交点.第一个输入的为有n个交点.之后第一个输入的点,当前铁路到这个点是不要转向的,也就是权值为0,其余的权值都为1,求从x到y的最短路,如果到不了输出-1 裸的floyd和spfa: 1 #include <stdio.h> 2 #include <string.h> 3 #define inf 0x3f3f

POJ 1847 dijstra算法

POJ 无限循环CE中.感觉是读题难.然后就可以建图上模板了. 附个人代码: #include<stdio.h>#include<string.h>#include<iostream>#define maxn 0x1f1f1f1f#define size 210using namespace std; int low[size];bool used[size];int map[size][size];int n, a, b; void init(){    for (i

(简单) POJ 1847 Tram,Dijkstra。

Description Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch pointing to the one of the rails going out of the intersection. When the tram enters the intersection

Floyd_Warshall POJ 1847 Tram

题目传送门 题意:这题题目难懂.问题是A到B最少要转换几次城市.告诉每个城市相连的关系图,默认与第一个之间相连,就是不用转换,其余都要转换. 分析:把第一个城市权值设为0, 其余设为0.然后Floyd跑一下,得到A到B最少转换几次.有点水 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1e2 + 5; const int INF =

POJ 1847 Tram【Floyd】

题意:给出n个站点,每个站点都有铁路通向其他站点 如果当前要走得路恰好是该站点的开关指向的铁路,则不用扳开关,否则要手动扳动开关,给出起点和终点,问最少需要扳动多少次开关 输入的第一行是n,start,end 接下来的n行,每一行中,第一个数是该站点向外连接的铁路条数, 第二个数是该站点的开关指向的铁路(因为这儿没有读懂= =所以都建不出图来--5555参见这一句话:Switch in the i-th intersection is initially pointing in the dire

poj 1847 Tram【spfa最短路】

Tram Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12005   Accepted: 4365 Description Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch pointing to t