「Poetize7」电话线路

描述

每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示。电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”。而a、b之间建立通信联系所需要的时间为cost[ lcp(a,b) ],其中cost[]是一个常数数 组,lcp(a,b)表示a、b的最长公共前缀的长度,lcp(a,b)越大,通信时间越快。
另外,如果a、b能通信,b、c能通信,那么a、c也能借助b来通信。a、c借助b建立通信联系所用时间是cost[ lcp(a,b) ]+ cost[ lcp(b,c) ]。
现在Freda想给Rainbow打电话,请你告诉Freda,她最快需要多少时间才能与与Rainbow建立通信联系?

题解:

这题也比较裸。

直接枚举每个电话号码能与谁连边,然后构图spfa即可。

关键在于把时间复杂度降下来。

我写的map T了5个点。。。

后来好好想了想改成hash没用heap+dij 和 slf优化 ,朴素的spfa也过了。

代码:AC

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 50000+100
14 #define maxm 1000000
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 #define mod 999991
23 using namespace std;
24 inline ll read()
25 {
26     ll x=0,f=1;char ch=getchar();
27     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
28     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
29     return x*f;
30 }
31 map<string,int>mp;
32 struct edge{ll go;int next,w;}e[100*maxn],f[maxn];
33 int n,m,tot,head[maxn],h[mod],v[maxn],q[maxn+1],d[maxn],cost[15];
34 ll a[15],b[15];
35 string s[maxn],ss;
36 char st[maxn];
37 inline void insert(int x,int y,int z)
38 {
39     e[++tot].go=y;e[tot].next=head[x];head[x]=tot;e[tot].w=z;
40     e[++tot].go=x;e[tot].next=head[y];head[y]=tot;e[tot].w=z;
41 }
42 inline int hash(ll x)
43 {
44     int y=x%mod;
45     for(int i=h[y];i;i=f[i].next)
46      if(f[i].go==x)return i;
47     return 0;
48 }
49 void spfa()
50 {
51     for1(i,n)d[i]=inf;
52     int l=0,r=1;q[1]=1;d[1]=0;
53     while(l!=r)
54     {
55         int x=q[++l];v[x]=0;if(l==maxn)l=0;
56         for(int i=head[x],y;i;i=e[i].next)
57             if(d[x]+e[i].w<d[y=e[i].go])
58             {
59                 d[y]=d[x]+e[i].w;
60                 if(!v[y]){q[++r]=y;v[y]=1;if(r==maxn)r=0;}
61             }
62     }
63 }
64 int main()
65 {
66     freopen("input.txt","r",stdin);
67     freopen("output.txt","w",stdout);
68     n=read();
69     for0(i,9)cost[i]=read();
70     b[0]=1;for1(i,9)b[i]=b[i-1]*10;
71     for1(i,n)
72     {
73         ll x=read(),y=x%mod,t=x;
74         f[i].go=x;f[i].next=h[y];h[y]=i;
75         for0(j,9)a[j]=t%10,t/=10;
76         for0(j,9)
77          for0(k,9)
78           {
79             if(j!=k&&a[j]!=a[k])
80             {
81                 t=x-a[j]*b[j]-a[k]*b[k]+a[j]*b[k]+a[k]*b[j];
82                 y=hash(t);
83                 if(y)insert(i,y,cost[9-max(j,k)]);
84             }
85             if(a[j]!=k)
86             {
87                 t=x-a[j]*b[j]+(ll)k*b[j];
88                 y=hash(t);
89                 if(y)insert(i,y,cost[9-j]);
90             }
91           }
92     }
93     spfa();
94     printf("%d\n",d[n]==inf?-1:d[n]);
95     return 0;
96 }

代码:map

  1 #include<cstdio>
  2
  3 #include<cstdlib>
  4
  5 #include<cmath>
  6
  7 #include<cstring>
  8
  9 #include<algorithm>
 10
 11 #include<iostream>
 12
 13 #include<vector>
 14
 15 #include<map>
 16
 17 #include<set>
 18
 19 #include<queue>
 20
 21 #include<string>
 22
 23 #define inf 1000000000
 24
 25 #define maxn 50000+100
 26
 27 #define maxm 500+100
 28
 29 #define eps 1e-10
 30
 31 #define ll long long
 32
 33 #define pa pair<int,int>
 34
 35 #define for0(i,n) for(int i=0;i<=(n);i++)
 36
 37 #define for1(i,n) for(int i=1;i<=(n);i++)
 38
 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 40
 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 42
 43 #define mod 1000000007
 44
 45 using namespace std;
 46
 47 inline int read()
 48
 49 {
 50
 51     int x=0,f=1;char ch=getchar();
 52
 53     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 54
 55     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
 56
 57     return x*f;
 58
 59 }
 60 map<string,int>mp;
 61 struct edge{int go,next,w;}e[100*maxn];
 62 int n,m,tot,head[maxn],v[maxn],q[maxn+1],d[maxn],cost[15];
 63 string s[maxn],ss;
 64 char st[maxn];
 65 inline void insert(int x,int y,int z)
 66 {
 67     e[++tot].go=y;e[tot].next=head[x];head[x]=tot;e[tot].w=z;
 68 }
 69 void spfa()
 70 {
 71     for1(i,n)d[i]=inf;
 72     int l=0,r=1;q[1]=1;d[1]=0;
 73     while(l!=r)
 74     {
 75         int x=q[++l];v[x]=0;if(l==maxn)l=0;
 76         for(int i=head[x],y;i;i=e[i].next)
 77             if(d[x]+e[i].w<d[y=e[i].go])
 78             {
 79                 d[y]=d[x]+e[i].w;
 80                 if(!v[y]){q[++r]=y;v[y]=1;if(r==maxn)r=0;}
 81             }
 82     }
 83 }
 84
 85 int main()
 86
 87 {
 88
 89     n=read();
 90     for0(i,9)cost[i]=read();
 91     for1(i,n){scanf("%s",st);s[i]=st;mp[s[i]]=i;}
 92     for1(i,n)
 93      {
 94        ss=s[i];
 95        for0(j,9)
 96          for0(k,9)
 97           if(ss[j]-‘0‘!=k)
 98           {
 99             ss[j]=k+‘0‘;
100             int x=mp[ss];
101             if(x)insert(i,x,cost[j]);
102             ss[j]=s[i][j];
103           }
104        for0(j,9)
105           for0(k,9)
106            if(j!=k&&ss[j]!=ss[k])
107           {
108               swap(ss[j],ss[k]);
109               int x=mp[ss];
110               if(x)insert(i,x,cost[min(j,k)]);
111               swap(ss[j],ss[k]);
112           }
113      }
114     spfa();
115     printf("%d\n",d[n]==inf?-1:d[n]);
116
117     return 0;
118
119 }

时间: 2024-10-15 09:40:43

「Poetize7」电话线路的相关文章

「Poetize7」Freda的访客

描述 Description 小猫们看到蛋糕比饼干大之后,普遍认为蛋糕比饼干要好>.<.所以,如果Freda 给了第i 只小猫蛋糕且这个小猫是第一个吃到蛋糕的,那么就必须给第i+2,i+4,i+6......只小猫蛋糕.也就是说,如果存在正整数i,满足:1.对于所有的0<j<i,第j 只小猫吃到的是饼干2.第i 只小猫吃到的是蛋糕那么就必须有:对于所有的i<k<=N, k mod 2 = i mod 2,第k 只小猫吃到的是蛋糕.小猫的数目一多,Freda 就忙不过来了

「Poetize7」足球比赛

描述 Description SJZEZ和TSYZ正在进行一轮足球联谊赛,根据规则,这轮比赛有两场,一场在SJZEZ的主场进行,一场在TSYZ的主场进行.胜负判断标准如下:1.在两场比赛中进球总数较多的一方赢得比赛.2.如果双方进球总数相同,在对方主场进球更多的一方赢得比赛.3.如果1.2都相同,胜利者将会随机产生= =双方已经进行了一场比赛,作为SJZEZ的队长,忘川沧月童鞋想知道:(1)第二场sjzez最少需要进多少球,才有可能赢得比赛.(2)第二场sjzez进不超过多少个球,tsyz才有可

「MoreThanJava」计算机发展史—从织布机到IBM

「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 不论新老朋友 我相信您都可以 从中获益.如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! 一.织布机 | 一切的开端 如今代表智能现代的计算机与老式织布机的血缘关系超乎你的想象.无论是摆在写字台上的 台式机.塞在口袋里的 掌上电脑.

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

程序员「奇葩」说

一直以来「奇葩」这个词都是偏贬义的,直到去年有个综艺节目叫「奇葩说」挺热闹,这里的人不一定是奇葩,更多指达人的意思. 「奇葩说」里的达人都是能说会道的,我的主业是程序员,所以只能写写在我职业生涯中碰到的一些「奇葩」程序员. 你懂的,我这里的「奇葩」没有任何贬义的意思. 月在胸襟人在途 我刚入行时的第一位项目经理,70后.那年三十出头,在银行客户现场做项目经理,负责一个二十来人的客户现场团队. 虽然他的职位是项目经理,但实际那时他真是一名地道的资深程序员. 70 后的程序员大都是从写 C 开始的,

正在用华为手机的你,怎能少了这一「神器」

人们总希望有后悔药,能够在意外发生时「倒流时光」.但现实告诉我们的是,世界上根本就没有后悔药,我们能做的只有在意外发生前买好「保险」,将意外造成的风险降到最低,而最近,我发现「买保险」的这一原则同样适用于华为手机. 但别会错意,此「保险」非彼「保险」,并不是说让你真的为手机买一期「机身安全险」,这个保险指的是「华为云空间」,如果你能够善加利用 TA,那么 TA 将能够最大程度地降低你在使用手机时可能会发生的风险. 真的有必要使用手机上的云空间吗? 相信在许多人脑海中,首先浮现的就是这个问题:到底

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知

「Unity」与iOS、Android平台的整合:3、导出的Android-Studio工程

本文属于「Unity与iOS.Android平台的整合」系列文章之一,转载请注明出处. Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的. 个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题. 所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分. 不过我之后的相关内容都会使用AndroidStudio,希望依然