【UVA 10816】 Travel in Desert (最小瓶頸樹+最短路)

【題意】

  有n個綠洲, m條道路,每條路上有一個溫度,和一個路程長度,從綠洲s到綠洲t,求一條道路的最高溫度盡量小, 如果有多條, 選一條總路程最短的。

Input
Input consists of several test cases. Your program must process all of them.
The first line contains two integers N and E (1 ≤ N ≤ 100; 1 ≤ E ≤ 10000) where N represents the
number of oasis and E represents the number of paths between them. Next line contains two distinct
integers S and T (1 ≤ S, T ≤ N) representing the starting point and the destination respectively. The
following E lines are the information the group gathered. Each line contains 2 integers X, Y and 2 real
numbers R and D (1 ≤ X, Y ≤ N; 20 ≤ R ≤ 50; 0 < D ≤ 40). It means there is a path between X and
Y , with length D km and highest temperature RoC. Each real number has exactly one digit after the
decimal point. There might be more than one path between a pair of oases.
Output
Print two lines for each test case. The first line should give the route you find, and the second should
contain its length and maximum temperature.
Sample Input
6 9
1 6
1 2 37.1 10.2
2 3 40.5 20.7
3 4 42.8 19.0
3 1 38.3 15.8
4 5 39.7 11.1
6 3 36.0 22.5
5 6 43.9 10.2
2 6 44.2 15.2
4 6 34.2 17.4
Sample Output
1 3 6
38.3 38.3

?

?

【分析】

  我們可以先求出最大溫度的最小值,然后把小于等于這個溫度的邊加進圖中跑最短路。

  最短路就不說了,現在就是要求最小瓶頸路。

  最小瓶頸路有兩個方法,

  1、二分+BFS?

    二分之后沿著小于等于這個溫度的邊走,只需判斷能否走到終點,所以是mlogn的。

  2、

    但其實可以nlogn把圖上所有兩點的最小瓶頸路求出來,就是求出最小瓶頸樹,那么兩點之間的唯一路徑就是他們的最小瓶頸路。

    而最小生成樹就是一個最小瓶頸樹。

  [其實這個,我也不是很會證明的說- -誰能告訴我- -]

?

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<cmath>
  8 using namespace std;
  9 #define Maxn 110
 10 #define Maxm 10010
 11 #define INF 0xfffffff
 12 
 13 int n,m,st,ed;
 14 
 15 struct node
 16 {
 17     int x,y,c,d;
 18     int next;
 19 }tt[Maxm],t[Maxm*2];
 20 int len,first[Maxn];
 21 
 22 bool cmp(node x,node y) {return x.c<y.c;}
 23 // double mymax(double x,double y) {return x>y?x:y;}
 24 int mymax(int x,int y) {return x>y?x:y;}
 25 
 26 int fa[Maxn];
 27 int ffa(int x)
 28 {
 29     if(fa[x]!=x) fa[x]=ffa(fa[x]);
 30     return fa[x];
 31 }
 32 
 33 void ins(int x,int y,int c)
 34 {
 35     t[++len].x=x;t[len].y=y;t[len].c=c;
 36     t[len].next=first[x];first[x]=len;
 37 }
 38 
 39 int mx[Maxn];
 40 void dfs(int x,int f)
 41 {
 42     for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
 43     {
 44         int y=t[i].y;
 45         mx[y]=mymax(mx[x],t[i].c);
 46         dfs(y,x);
 47     }
 48 }
 49 
 50 queue<int > q;
 51 int pre[Maxn],dis[Maxn];
 52 bool inq[Maxn];
 53 void spfa()
 54 {
 55     while(!q.empty()) q.pop();
 56     // for(int i=1;i<=n;i++) dis[i]=INF;
 57     memset(dis,63,sizeof(dis));
 58     memset(inq,0,sizeof(inq));
 59     q.push(ed);inq[ed]=1;dis[ed]=0;
 60     while(!q.empty())
 61     {
 62         int x=q.front();
 63         for(int i=first[x];i;i=t[i].next)
 64         {
 65             int y=t[i].y;
 66             if(dis[y]>dis[x]+t[i].c)
 67             {
 68                 dis[y]=dis[x]+t[i].c;
 69                 pre[y]=x;
 70                 if(!inq[y])
 71                 {
 72                     q.push(y);
 73                     inq[y]=1;
 74                 }
 75             }
 76         }
 77         inq[x]=0;q.pop();
 78     }
 79     if(dis[st]>=INF-10000) return;
 80     int now=st;
 81     while(now!=ed)
 82     {
 83         printf("%d ",now);
 84         now=pre[now];
 85     }
 86     printf("%d\n",ed);
 87     printf("%.1lf %.1lf\n",dis[st]*1.0/10,mx[st]*1.0/10);
 88 }
 89 
 90 int main()
 91 {
 92     while(scanf("%d%d",&n,&m)!=EOF)
 93     {
 94         scanf("%d%d",&st,&ed);
 95         for(int i=1;i<=m;i++)
 96         {
 97             double c,d;
 98             scanf("%d%d%lf%lf",&tt[i].x,&tt[i].y,&c,&d);
 99             tt[i].c=(int)round(c*10);tt[i].d=(int)round(d*10);
100         }
101         sort(tt+1,tt+1+m,cmp);
102         for(int i=1;i<=n;i++) fa[i]=i;
103         int cnt=0;
104         memset(first,0,sizeof(first));
105         len=0;
106         for(int i=1;i<=m;i++)
107         {
108             if(ffa(tt[i].x)!=ffa(tt[i].y))
109             {
110                 fa[ffa(tt[i].x)]=ffa(tt[i].y);
111                 cnt++;
112                 ins(tt[i].x,tt[i].y,tt[i].c);
113                 ins(tt[i].y,tt[i].x,tt[i].c);
114             }
115             if(cnt==n-1) break;
116         }
117         mx[ed]=0;
118         dfs(ed,0);
119         len=0;
120         memset(first,0,sizeof(first));
121         for(int i=1;i<=m;i++) if(tt[i].c<=mx[st])
122         {
123             ins(tt[i].x,tt[i].y,tt[i].d);
124             ins(tt[i].y,tt[i].x,tt[i].d);
125         }
126         spfa();
127     }
128     return 0; 
129 }
View Code

?

2016-11-01?15:57:34

轉載于:https://www.cnblogs.com/Konjakmoyu/p/6019717.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373590.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[OJ] Data Stream Median (Hard)

LintCode 81. Data Stream Median (Hard) 思路: 用一個大根堆保存較小的一半數, 一個小根堆保存較大的一半數.每次根據num和兩個堆頂的數據決定往哪個堆里面放.放完后進行平衡確保兩個堆的size差不超過1.利用兩個堆的size和堆頂值計算median.大根堆可以表示為priority_queue<…

書評:JBoss AS 7:配置,部署和管理

我熱切地接受Packt Publishing邀請復審JBoss AS 7&#xff1a;配置&#xff0c;部署和管理&#xff0c;因為自從我上次使用JBoss已有數年了&#xff0c;我很想了解有關JBoss AS 7的更多信息。 我已經寫過關于《 JBoss AS 7配置&#xff0c;部署和管理》一書的第一印象&#xff…

聯想小新air14筆記本黑屏_聯想小新air14銳龍版測評,談談它的好和壞

聯想小新air14銳龍版本測評了解數碼就找小俠客&#xff0c;我是機圈小俠客 今天呢&#xff0c;主要和大家測評一下聯想小新air14這款筆記本&#xff0c;總體而言的話&#xff0c;這款筆記本它是一個。對于辦公人士或者輕度游戲愛好者來說的話&#xff0c;是一個不錯的選擇&…

MongoDB學習3——mongoDB的一些基本使用

#查看所有數據庫show dbs;#創建&#xff08;切換&#xff09;數據庫use DATABASE_NAME注&#xff1a;如果數據庫不存在&#xff0c;則創建數據庫&#xff0c;否則切換到指定數據庫。#插入文檔&#xff08;關系型數據說法叫插入數據&#xff09;方式一&#xff1a;db.COLLECTION…

Java入門:Java下載與安裝方法

本文適合剛入門的Java編程的初學者閱讀。 JDK有兩種下載方法&#xff0c;一個是官網下載&#xff0c;另一個是第三方網站下載。官網速度也許有點慢&#xff0c;慢的話可以考慮去第三方網站下載。 一、官網下載 1. 訪問地址&#xff1a;http://www.oracle.com/cn/downloads/inde…

jquery獲得下拉框的值

獲取Select &#xff1a; 獲取select 選中的 text : $("#ddlRegType").find("option:selected").text(); 獲取select選中的 value: $("#ddlRegType ").val(); 獲取select選中的索引: $("#ddlRegType ").get(0).selectedIndex; 設置sel…

Java 7:如何編寫非常快速的Java代碼

當我第一次寫此博客時&#xff0c;我的目的是向您介紹ThreadLocalRandom類&#xff0c;它是Java 7中新增的用于生成隨機數的類。 我已在一系列微基準測試中分析了ThreadLocalRandom的性能&#xff0c;以了解其在單線程環境中的性能。 結果相對令人驚訝&#xff1a;盡管代碼非常…

python 微信支付接口 詳解_Python支付接口匯總大全(包含微信、支付寶等,長期更新、歡迎補充)...

wzhifuSDK- 由微信支付SDK 官方PHP Demo移植而來&#xff0c;v3.37下載地址學習Python中有不明白推薦加入交流群號&#xff1a;864573496群里有志同道合的小伙伴&#xff0c;互幫互助&#xff0c;群里有不錯的視頻學習教程和PDF&#xff01;weixin_pay- 是一個簡單的微信支付的…

[地圖開發][算法及數據結構]四叉樹原理

參考&#xff1a;http://blog.csdn.net/zhouxuguang236/article/details/12312099 原博客地址還有c&#xff0b;&#xff0b;源碼。。。 四叉樹索引的基本思想是將地理空間遞歸劃分為不同層次的樹結構。它將已知范圍的空間等分成四個相等的子空間&#xff0c;如此遞歸下去&…

mongoDB中的數據類型

Date mongo shell中提供各式各樣的返回日期類型的方法&#xff0c;例如字符串類型或者Date對象類型&#xff1a; Date()返回當前的日期字符串&#xff1b;new Date()返回使用ISODate()包裝的Date對象類型&#xff1b;ISODate()返回使用ISODate()包裝的Date對象類型&#xff1b;…

C++ namespace

是否應該使用using(using namespace std) 注&#xff1a;我將namespace翻譯成姓或士族。選擇某個namespace中的變量、函數、組合類型&#xff0c;就像是在介紹某個人 姓 namespace, 名 variable。 參考&#xff1a; 1、Why is “using namespace std” considered bad practice…

按鍵 粘貼上一個命令_合并單元格、選擇性粘貼的快捷鍵都是啥?今天一次告訴你……...

經常有人在群里問&#xff0c;合并單元格的快捷鍵是什么&#xff1f;選擇性粘貼數值的快捷鍵是什么&#xff1f;今天就來聊聊快捷鍵的一些冷門知識……Alt鍵的作用快捷鍵其實就是一些組合鍵&#xff0c;主要用到Ctrl、shift、Alt這三個鍵其中之一或者是幾個&#xff0c;再加上其…

Spring MVC和JQuery用于Ajax表單驗證

在本教程中&#xff0c;我們將看到如何使用Ajax和Spring MVC和JQuery在服務器端驗證表單。 Spring MVC為通過注釋驅動的配置采用Ajax提供了非常方便的過程。 我們將使用此注釋驅動的配置以JSON數據的形式發送Ajax響應。 響應將包含表單驗證的狀態&#xff0c;并且表單數據中存在…

myeclipse10.7破解成功 但 無法打war包 提示:securecrt alert:integrity ch

myeclipse10.7破解成功 但 無法打war包 提示&#xff1a;securecrt alert:integritycheck error找了好久才找到解決辦法http://download.csdn.net/detail/yi303526230/6889101#comment本次對于myeclipse10破解后&#xff0c;導出war包時報“SECURITY ALERT: INTEGERITY CHECK E…

Mongodb的update操作

在前面的文章“mongodb 查詢的語法”里&#xff0c;我介紹了Mongodb的常用查詢語法&#xff0c;Mongodb的update操作也有點復雜&#xff0c;我結合自己的使用經驗&#xff0c;在這里介紹一下&#xff0c;給用mongodb的朋友看看&#xff0c;也方便以后自己用到的時候查閱&#x…

封裝方法

<?php class DBDA {public $host"localhost";public $uid"root";public $pwd"123";public $dbname"mydb";/***給一個sql語句&#xff0c;返回執行的結果*param string $sql 用戶指定的sql語句*param int $type 用戶給的語句類型&a…

AFNetwork 作用和使用方法具體解釋

轉自&#xff1a;http://www.maxiaoguo.com/clothes/269.html AFNetworking是一個輕量級的iOS網絡通信類庫。它建立在NSURLConnection和NSOperation等類庫的基礎上&#xff0c;讓非常多網絡通信功能的實現變得十分簡單。它支持HTTP請求和基于REST的網絡服務&#xff08;包含GET…

在MongoDB中存儲分層數據

繼續使用MongoDB進行 NoSQL之旅&#xff0c;我想觸摸一個經常出現的特定用例&#xff1a;存儲分層文檔關系。 MongoDB是很棒的文檔數據存儲&#xff0c;但是如果文檔具有父子關系怎么辦&#xff1f; 我們可以有效地存儲和查詢此類文檔層次結構嗎&#xff1f; 答案是肯定的&…

圖的深度遍歷

圖的深度遍歷 Time Limit: 1000MS Memory Limit: 65536KBSubmit StatisticProblem Description 請定一個無向圖&#xff0c;頂點編號從0到n-1&#xff0c;用深度優先搜索(DFS)&#xff0c;遍歷并輸出。遍歷時&#xff0c;先遍歷節點編號小的。Input 輸入第一行為整數n&#xff…

Linux學習筆記——gzip命令

這個 gzip 程序被用來壓縮一個或多個文件。當執行 gzip 命令時&#xff0c;則原始文件的壓縮版會替代原始文件。 相對應的 gunzip 程序被用來把壓縮文件復原為沒有被壓縮的版本。gzip 選項&#xff1a;選項 說明-c把輸出寫入到標準輸出&#xff0c;并且保留原始文件。也有可能用…