luogu P1948 [USACO08JAN]电话线Telephone Lines
来源:互联网 发布:无锡移动网络办理 编辑:程序博客网 时间:2024/06/05 03:41
反正闲着也是闲着,不如再写一篇颓废史。
这是一道二分答案加spfa的题,
然而我在做的时候,不知道那位dalao贴了一个“搜索”标签,于是乎,本来就是搜索标签的我按搜索做了
然后就A掉了。(我自己也是一脸懵)
然后还贴了个题解
首先声明一点,我并不会dfs,我只会BFS
至于我为什么只会bfs呢,这是因为我觉得bfs很优美啊,特别是可以记录重复状态这一项(开一个bool就行)
所以说,我无论什么题,基本都写bfs
好了好了,扯多了。回到这个题来。
以下是我的题解:
在题解栏看到各位dalao都用二分潇洒地秒过,我弱弱的写了一个BFS,期望得分50,没想到A掉了。
思路很简单,用一个状态{now,nowk,nowdis}来记录每个节点的请况:走到了哪那个节点,用掉了多少个免费线,当前花费是几
然后从每个节点,向与它相连的节点扩展免费和不免费两种请况,
但是这样很可能不是TLE就是RE,所以说我们要加上剪枝(BFS的剪枝好神奇的说),
用数组mink[i][j]表示走到i节点,用了j根免费线,花费的最小值是多少,
如果扩展的新状态还不如mink[i][j]中已经储存的状态优,那就没必要扩展了。
这样时间就控制在了可以接受的范围之内。
队列最好是循环,否则我也不知道会不会炸掉。
最后,在mink[n][0~k]之中取最小值就是结果了。
上代码:#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std; struct edge{ int to;int dis;int next;};struct node{ int now;int nowk;int nowdis;};node q[1000000+666];edge e[10000*3+666];int h[1000+666];int p,hh,tt;int n,m,k;int mink[1005][1005];//到达i点,使用j个免费线,其中花费最小值。inline int ra(){ int x=0;char ch=getchar();int flag=1; while(ch>'9'||ch<'0'){if(ch=='-')flag=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x*=10;x+=ch-'0';ch=getchar();} return x*flag; } void add(int a,int b,int c){ p++; e[p].next=h[a]; e[p].to=b; e[p].dis=c; h[a]=p; return ;}inline void in(int now,int k,int dis){ q[tt].now=now; q[tt].nowk=k; q[tt].nowdis=dis; tt++; if(tt==1000000+666)tt=0; return;}void bfs(){ while(hh!=tt) { int now,nowk,nowdis; now=q[hh].now;nowk=q[hh].nowk;nowdis=q[hh].nowdis; hh++; if(hh==1000000+666)hh=0; for(int i=h[now];i;i=e[i].next) { int to=e[i].to; if(max(nowdis,e[i].dis)<mink[to][nowk]) { mink[to][nowk]=max(nowdis,e[i].dis); in(to,nowk,max(nowdis,e[i].dis)); } if(nowdis<mink[to][nowk+1]&&nowk<k) { mink[to][nowk+1]=nowdis; in(to,nowk+1,nowdis); } } }}int main(){ n=ra();m=ra();k=ra(); for(int i=1;i<=m;i++) { int a,b,c; a=ra();b=ra();c=ra(); add(a,b,c); add(b,a,c); } in(1,0,0); memset(mink,0x3f,sizeof(mink)); for(int i=0;i<=k;i++)mink[1][i]=0; bfs(); int ans=0x7fffffff; for(int i=0;i<=k;i++) ans=min(ans,mink[n][i]); //cout<<ans<<endl; if(ans==0x3f3f3f3f)cout<<"-1"<<endl; else cout<<ans<<endl; return 0;}
对了,忘了提醒各位dalao,我的队列和正常人的队列是相反的。
入队处出队,出队处入队。
阅读全文
0 0
- luogu P1948 [USACO08JAN]电话线Telephone Lines
- [USACO08JAN]电话线Telephone Lines 洛谷P1948
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines【NOIP模拟笨笨的电话线】
- POJ3662,洛谷1948 [USACO08JAN]电话线Telephone Lines
- 洛谷 1948 [USACO08JAN]电话线Telephone Lines
- 二分查找+spfa(洛谷1948 [USACO08JAN]电话线Telephone Lines)
- [Usaco08Jan&luogu1948] Telephone Lines
- 【USACO08JAN】洛谷1948 Telephone Lines
- [Usaco2007 Jan]Telephone Lines架设电话线
- 1614: [Usaco2007 Jan]Telephone Lines架设电话线
- [BZOJ1614][Usaco2007 Jan]Telephone Lines架设电话线
- BZOJ1614: [Usaco2007 Jan]Telephone Lines架设电话线
- [BZOJ1614][Usaco2007 Jan]Telephone Lines架设电话线
- bzoj1614【Usaco2007 Jan】Telephone Lines 架设电话线
- [Usaco2007 Jan]Telephone Lines架设电话线
- 1614: [Usaco2007 Jan]Telephone Lines架设电话线
- bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
- 搭建WebRtc环境
- NOJ(1004)-回溯算法-01背包问题
- 【SSLGZ 2783】2017年10月23日提高组T1 摆书
- 数据结构——数组-有序矩阵查找算法
- 国家省市区四级联动
- luogu P1948 [USACO08JAN]电话线Telephone Lines
- c++基础之define宏定义
- LeanCloud save object fail
- sdnu1138shopping
- sRGB色域与NTSC色域
- ESP32-使用eFuse 固化VDD_SDIO支持电压,释放GPIO12
- 47. Permutations II
- 通过序列和触发器实现Oracle主键自增长
- Java的方法重载规则