poj 1847 最短路简单题,dijkstra

1、poj  1847  Tram   最短路

2、总结:用dijkstra做的,算出a到其它各个点要改向的次数。其它应该也可以。

题意: 有点难懂。n个结点,每个点可通向ki个相邻点,默认指向第一个相邻点,可以改变指向。求一条从A到B的路,使用最少改变路上点的指向的次数。

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#define max(a,b) a>b?a:b
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const int N=110;

int mapn[N][N],visit[N];
int change[N];  //改向的次数
int n,a,b;

void Dijkstra()
{
    int f;
    memset(visit,0,sizeof(visit));
    for(int i=1;i<=n;i++){
        change[i]=mapn[a][i];
    }
    visit[a]=1;

    for(int i=2;i<=n;i++)
    {
        int minn=INF;
        f=-1;
        for(int j=1;j<=n;j++){
            if(!visit[j]&&minn>change[j]){
                minn=change[j];
                f=j;    //f存储连通分量中到a需改向数最少的点
            }
        }
        if(f==-1)break;    //找不到可通点就跳出
        visit[f]=1;

        for(int j=1;j<=n;j++){  //更新change
            if(!visit[j]&&change[f]+mapn[f][j]<change[j]){
                change[j]=change[f]+mapn[f][j];
            }
        }
    }

    if(change[b]==INF)printf("-1\n");
    else printf("%d\n",change[b]);
}

int main()
{
    while(scanf("%d%d%d",&n,&a,&b)!=EOF)
    {
        memset(mapn,INF,sizeof(mapn));
        for(int l=1;l<=n;l++)
        {
            int ki,m;
            scanf("%d",&ki);
            if(!ki)continue;  //注意细节
            scanf("%d",&m);
            mapn[l][m]=0;
            for(int i=2;i<=ki;i++){
                scanf("%d",&m);
                mapn[l][m]=1;
            }
        }

        Dijkstra();
    }

    return 0;
}

时间: 2024-11-08 19:16:41

poj 1847 最短路简单题,dijkstra的相关文章

POJ 2051 argus(简单题,堆排序or优先队列)

又是一道数据结构题,使用堆来进行权值调整和排序,每次调整都是o(n)的复杂度,非常高效. 第一眼看题觉得可以用优先队列来做,应该也很简单. 事实上多数优先队列都是通过堆来实现的. 写的时候还是出了一些问题: 1.二叉树根节点下标显然不能为0: 2.限界之后若出现扩界要小心: 3.在迭代循环比较的时候,尤其注意到底比较的是谁,别把自己绕晕了. ac代码: #include<iostream> #include<cstdio> #include<cstdlib> #incl

POJ 3619 Speed Reading(简单题)

[题意简述]:有K头牛,N页书,每次第i头牛每分钟只能读Si页书,连续读Ti分钟,之后休息Ri分钟.现在问我们第i头牛花费多少时间可以读完这N页书. [分析]:简单的模拟 //220K 32Ms #include<iostream> #include<cmath> using namespace std; int main() { double N,K,Si,Ti,Ri; cin>>N>>K; double a = N; for(int i = 0;i<

poj 2955 Brackets dp简单题

//poj 2955 //sep9 #include <iostream> using namespace std; char s[128]; int dp[128][128]; int n; int rec(int l,int r) { if(dp[l][r]!=-1) return dp[l][r]; if(l==r) return dp[l][r]=0; if(l+1==r){ if(s[l]=='('&&s[r]==')') return dp[l][r]=2; if(

POJ 2575 Jolly Jumpers(简单题)

[题意简述]:将数列中相邻的两个数做差,判断得到的绝对值是否是1,2,--,n-1,如果是的话,则是Jolly ,否则not jolly. [分析]:开始时没有仔细看题,没有看到时相邻的两个数做差,以为任意两两做差. 而后重新分析题目后,解决了这道题目,我们可以使用一个标志数组来帮助我们储存得到的做差的绝对值的值,最后,我们只需要扫描一下这个数组看是否从1,2,--,n-1都有值与之相对应. 详见代码: // 324K 47Ms #include<iostream> #include<c

poj 2387 最短路模板题

Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible. Farmer John's field ha

POJ 3589 Number-guessing Game(简单题)

[题目简述]:两个四位数,假设后一个数中的某个数与前一个相应的数的位置和值都相等.则统计数目由几个这种数.记为count1吧. 假设后一个数中的某个数与前一个数的数值相等,但位置不同. 此时这种数的个数记为count2. 写成*A*B,即count1 A count2 B. [分析]:题目的简述即分析. //740K 0Ms #include<iostream> #include<cstring> using namespace std; int main() { int T; s

POJ 3299 Humidex(简单题)

[题意简述]:就是什么温度,湿度--,之间的转换.. [分析]:公式已给出了. // 252k 0Ms /* 其中exp表示的是求e的x次幂 解法就直接根据题目中的公式解决就好!! */ #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main() { double t,d,h; char alpha; while(1) { t = d = h = 101; fo

POJ 2664 Prerequisites?(简单题)

[题意简述]:k:已经选择的科目数:m:选择的科目类别:c:可以选择的科目数:r:要求最少选择的科目数量 在输入的k和m下面的一行是选择的科目号. 例如: 3 2 //3是他选择了3科,2表示选择了两个类别 0123 9876 2222 //这是他选择的具体的3科科目的科目号 2 1 8888 2222 //其中2表示在这个类别里共有两科8888和2222,然后最少要选择这两个中的一个 3 2 9876 2222 7654 //这是第二个类别,含义同上. 具体代码: //208K 500Ms #

POJ 3458 Colour Sequence(简单题)

[题意简述]:事实上题意我也没有特别看懂.可是依据它少许的题目描写叙述加上给的例子.就大胆的做了例如以下的推測: 就是说,如今给出一串字符s.然后紧接着给出可见的字符串visible还有隐藏的字符串hidden. 让我们求s是否是visible或者hidden的子串,但要注意的是,这里visible和hidden事实上能够看成是一起的.咱们要做的是它们组合在一起之后,(也就是说.每一个位置相应两个字符.一个是visible的,一个是hidden的.)s 是不是它的子串. [分析]:有了题目的描写