前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 1847 Tram(详细题意+dijkstra)

POJ 1847 Tram(详细题意+dijkstra)

作者头像
Ch_Zaqdt
发布2019-01-11 10:58:11
4580
发布2019-01-11 10:58:11
举报
文章被收录于专栏:Zaqdt_ACM

题目链接:http://poj.org/problem?id=1847

        题意是输入n,a,b三个数,表示有n个点(1-n),起点是a,终点是b,然后接下来有n行,每一行的第一个数m表示后面将会有m个数,输入结构是这样的,然后我再具体的解释一下。

代码语言:javascript
复制
    3 2 1     3表示共有n个点,接下来有n行,2表示起点,1表示终点
    2 2 3     第一个数2表示后面有2个数,因为这是第1行,所以后面两个数表示从1到2和从1到3的边
    2 3 1     表示从2到3和从2到1的边
    2 1 2     表示从3到1和从3到2的边

       因为每个点都有开关,第一个点是不需要开开关的,但是之后的每一个都要开开关,意思是输入m后的第一条边是不需要开开关的,后面的2-m的边都是需要开开关的,比如样例的第二行,2 2 3就是1-2这条边不需要开开关,1-3这条边需要开开关。这道题最后问的就是从a点到b点,最少需要开多少个开关,题意很难读懂,懂了以后这道题就很简单了,把用不用开开关的作为边的权值,不用开开关的权值为0,用开开关的边权值为1,然后跑个dij就好了。


AC代码:

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
#define maxn 505
using namespace std;
struct Node{
  int to,w,next;
  bool operator < (const Node &a) const {
    return a.w < w;
  }
}Edge[maxn * maxn],Now,Next;
int head[maxn * maxn],num;
int n,m,a,b;

void init(){
  memset(head,-1,sizeof(head));
  num = 0;
}

void add(int u,int v,int w){
  Edge[num].to = v;
  Edge[num].w = w;
  Edge[num].next = head[u];
  head[u] = num ++;
}

void dijkstra(){
  int dist[maxn];
  bool vis[maxn];
  memset(dist,inf,sizeof(dist));
  memset(vis,false,sizeof(vis));
  dist[a] = 0;
  Now.to = a;
  priority_queue<Node> q;
  q.push(Now);
  while(!q.empty()){
    Now = q.top();
    q.pop();
    int ans = Now.to;
    if(vis[ans]) continue;
    vis[ans] = true;
    for(int i=head[ans];i!=-1;i=Edge[i].next){
      int u = Edge[i].to;
      if(!vis[u] && dist[u] > dist[ans] + Edge[i].w){
        dist[u] = dist[ans] + Edge[i].w;
        Next.to = u;
        Next.w = dist[u];
        q.push(Next);
      }
    }
  }
  printf("%d\n",dist[b] == inf ? -1 : dist[b]);
}

int main()
{
  scanf("%d%d%d",&n,&a,&b);
  init();
  for(int i=1;i<=n;i++){
    scanf("%d",&m);
    int v;
    scanf("%d",&v);
    add(i, v, 0);
    for(int j=1;j<m;j++){
      scanf("%d",&v);
      add(i, v, 1);
    }
  }
  dijkstra();
  return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年10月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档