洛谷 P1396
2018-01-30 20:03
204 查看
传送门 :营救
题目描述
“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门……妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在s区。该市有m条大道连接n个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从s至t的路线,使得经过道路的拥挤度最大值最小。输入输出格式
输入格式:第一行四个数字n,m,s,t。接下来m行,每行三个数字,分别表示两个区和拥挤度。(有可能两个区之间有多条大道相连。)输出格式:
输出题目要求的拥挤度。
输入输出样例
输入样例#1: 复制3 3 1 3 1 2 2 2 3 1 1 3 3输出样例#1: 复制
2
思路:呃 这题第一感觉--题目描述真有意思。。。蛤?“跑题了!” 好吧,这题可以看成是最短路,也可以看成是最小生成树。。。新奇吧 -_-!
代码核心 就是这一句话:
dis[v]>max(dis[k],e[i].cost)
SPFA 模板
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; int n,cnt,m,s,t,a,b,c; struct Edge{ int to; int cost; int next; }e[40009]; int head[40009],dis[10009]; bool vis[10009]; void add(int u,int v,int len) { cnt++; e[cnt].to = v; e[cnt].cost = len; e[cnt].next = head[u]; head[u] = cnt ; } void SPFA(int s) { queue<int>q; for(int i=1;i<=n;i++) { dis[i] = 10009; vis[i] = 0; } q.push(s); dis[s] = 0; vis[s] = 1; while(!q.empty()) { int k = q.front(); q.pop(); vis[k] = 0; for(int i = head[k];~i;i = e[i].next) { int v = e[i].to; if(dis[v]>max(dis[k],e[i].cost) ) { dis[v] = max(dis[k],e[i].cost); if(!vis[v]) { q.push(v); vis[v] = 1; } } } } } int main() { scanf("%d%d%d%d",&n,&m,&s,&t); memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++) { cin>>a>>b>>c; add(a,b,c); add(b,a,c); } SPFA(s); cout<<dis[t]<<endl; return 0; }
最小生成树(克鲁斯卡尔) 首先按边的权值排序,然后进行比较和加边,如果发现 fa[s] == fa[t] 即此时起点和终点在一棵树上,那么就说明此时已经找到了这个最大的权值
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struct Node{ int a; int b; int len; }node[20009]; int n,m,s,t; int fa[10009]; int find(int x) { if(x!=fa[x]) fa[x] = find(fa[x]); return fa[x]; } bool cmp(Node x,Node y) { return x.len < y.len; } int main() { cin>>n>>m>>s>>t; for(int i =1;i<=n;i++) fa[i] = i; for(int i=1;i<=m;i++) { cin>>node[i].a>>node[i].b>>node[i].len; } sort(node+1,node+1+m,cmp); int tot = 0,ans = 0; for(int i=1;i<=m;i++) { if(find(node[i].a)!=find(node[i].b)) { tot++; fa[find(node[i].a)] = find(node[i].b); ans = max(ans,node[i].len); } if(find(s)==find(t)) break; if(tot == n-1) break; } cout<<ans<<endl; return 0; }
相关文章推荐
- 洛谷 P1396 营救
- 洛谷 P1396 营救
- 洛谷 P1396 营救
- 营救(洛谷 P1396)
- 洛谷[P1396]营救 并查集
- |洛谷|图论生成树|P1396 营救
- 洛谷 P1396 营救
- P1396 营救 洛谷
- 洛谷 P1024 [NOIP2001 T1] 一元三次方程求解
- 洛谷 P2038 无线网络发射器选址
- |洛谷|排序|P1781 宇宙总统
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
- 洛谷 P1991 无线通讯网
- 洛谷P1455 搭配购买
- 洛谷 P1182 数列分段Section II
- 洛谷 P1600 天天爱跑步
- 【洛谷 1032】 字串变换
- 洛谷1552 [APIO2012]派遣
- 洛谷 P1070 [NOIP2009 T4] 道路游戏
- 洛谷 P2486 [SDOI2011]染色