zoukankan      html  css  js  c++  java
  • Luogu P1078 文化之旅

    题目描述

    有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。

    现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

    输入输出格式

    输入格式:

    第一行为五个整数 N,K,M,S,T,每两个整数之间用一个空格隔开,依次代表国家个数(国家编号为 1 到 N),文化种数(文化编号为 1 到 K),道路的条数,以及起点和终点的编号(保证 S 不等于 T);

    第二行为 N 个整数,每两个整数之间用一个空格隔开,其中第 i个数 Ci,表示国家 i的文化为 Ci。

    接下来的 K 行,每行 K 个整数,每两个整数之间用一个空格隔开,记第 i 行的第 j 个数为 aij,aij= 1 表示文化 i 排斥外来文化 j(i 等于 j 时表示排斥相同文化的外来人),aij= 0 表示不排斥(注意 i 排斥 j 并不保证 j 一定也排斥 i)。

    接下来的 M 行,每行三个整数 u,v,d,每两个整数之间用一个空格隔开,表示国家 u与国家 v 有一条距离为 d 的可双向通行的道路(保证 u 不等于 v,两个国家之间可能有多条道路)。

    输出格式:

    输出只有一行,一个整数,表示使者从起点国家到达终点国家最少需要走的距离数(如果无解则输出-1)。

    输入输出样例

    输入样例#1: 
    2 2 1 1 2 
    1 2 
    0 1 
    1 0 
    1 2 10 
    
    输出样例#1: 
    -1
    输入样例#2: 
    2 2 1 1 2 
    1 2 
    0 1 
    0 0 
    1 2 10 
    输出样例#2: 
    10

    说明

    输入输出样例说明1

    由于到国家 2 必须要经过国家 1,而国家 2 的文明却排斥国家 1 的文明,所以不可能到达国家 2。

    输入输出样例说明2

    路线为 1 -> 2

    【数据范围】

    对于 100%的数据,有 2≤N≤100 1≤K≤100 1≤M≤N2 1≤ki≤K 1≤u, v≤N 1≤d≤1000 S≠T 1≤S,T≤N

    NOIP 2012 普及组 第四题

    好久没写博客了,这道题让我交了17次,才AQAQ,这道题辣么简单,先开始数组开小了,然后一直错,改了之后,一直80,下载数据才发现,如果开始的文化和结束的文化相同,也要输出-1,然后博主一直没发现,改了很久才发现。。。一定要认真读题啊!!!

    思路:

    就是跑一个最短路,spfa+slf优化模板,这道题考点就是在建边和读题仔细,然后就像平时那样搞一下就出来了QWQ!这道题的正解是DFS,同学们感兴趣也可以去试试QWQ!

    题目的传送门

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 const int maxn=500;
      4 
      5 int readd()
      6 {
      7 int aans=0;
      8 char ch=getchar();
      9 while(ch<'0'||ch>'9')
     10 ch=getchar();
     11 while(ch>='0'&&ch<='9')
     12 {
     13 aans*=10;
     14 aans+=ch-'0';
     15 ch=getchar();
     16 }
     17 return aans;
     18 }
     19 
     20 int n,k,m,s,t;
     21 int c[maxn]; 
     22 bool vis[maxn];
     23 int flag[maxn][maxn];
     24 int now[maxn];
     25 int dis[maxn];
     26 int js=1;
     27 struct node{
     28     int net;
     29     int to;
     30     int w;
     31 }a[10005];
     32 int cnt,head[maxn];
     33 
     34 inline void add(int i,int j,int w)
     35 {
     36     a[++cnt].to=j;
     37     a[cnt].net=head[i];
     38     a[cnt].w=w;
     39     head[i]=cnt;
     40 }
     41 inline void spfa(int s)
     42 {
     43     deque<int>q;
     44     for(int i=1; i<=maxn; i++)
     45         dis[i]=2147483647;
     46     memset(vis,false,sizeof(vis));
     47     q.push_back(s);
     48     dis[s]=0;
     49     vis[s]=true;
     50     while(!q.empty())
     51     {
     52         int u=q.front();
     53         q.pop_front();
     54         vis[u]=false;
     55         for(int i=head[u]; i; i=a[i].net)
     56         {
     57             int v=a[i].to;
     58             if(dis[v]>dis[u]+a[i].w)
     59             {
     60                 dis[v]=dis[u]+a[i].w;
     61                 if(!vis[v])
     62                 {
     63                     vis[v]=true;
     64                     if(q.empty()||dis[v]>dis[q.front()])
     65                     {
     66                         q.push_back(v);
     67                     }
     68                     else
     69                     {
     70                         q.push_front(v);
     71                     }
     72                 }
     73             }
     74         }
     75     }
     76 }
     77 
     78 int main()
     79 {
     80     n=readd();k=readd();m=readd();s=readd();t=readd();
     81     for(int i=1;i<=n;i++)
     82     {
     83         c[i]=readd();
     84     }
     85     for(int i=1;i<=k;i++)
     86     {
     87         for(int j=1;j<=k;j++)
     88         {
     89             flag[i][j]=readd();
     90         }
     91     }
     92     for(int i=1;i<=m;i++)
     93     {
     94         int u,v,d;
     95         u=readd();v=readd();d=readd();
     96         if(!flag[c[u]][c[v]])
     97         {
     98             add(u,v,d);
     99         }
    100         if(!flag[c[v]][c[u]])
    101         {
    102             add(v,u,d);
    103         }
    104     }    
    105     spfa(s);
    106     if(c[s]==c[t])
    107     {
    108         cout<<-1<<endl;
    109         return 0;
    110     }
    111     if(dis[t]==2147483647)
    112     {
    113         cout<<-1<<endl;
    114     }
    115     else
    116         printf("%d
    ",dis[t]);
    117     return 0;
    118 }
  • 相关阅读:
    Days like that:
    获取网站访问来源URL
    论坛里面的一个帖子
    Days like that:
    简单项目布署
    论坛里面的一个帖子
    获取网站访问来源URL
    piwik开放源代码的Web统计软件
    p标签里面不能嵌套div
    IO操作 第二篇 学习(转载)
  • 原文地址:https://www.cnblogs.com/Hammer-cwz-77/p/8483144.html
Copyright © 2011-2022 走看看