1. 程式人生 > >HDU 3499【最短路】

HDU 3499【最短路】

題意:
給你一幅圖,然後起點終點,然後有一個條件是可以使某條邊的花費減半,求最短路的最小花費。
思路:
(來自大哥)
最短路的時候多一維,途中是否有花費減半的邊;
然後轉移,如果上一條有減半的,這一條一定只能轉移到不能減半,上一條沒有減半的,這一條可以減半也可以不減半。
具體處理就是一個二維的處理,網上說分層圖,其實我感覺就是DP的思想,還有有一種從一張圖跑到另一張圖的feel。
後來wa了,就是挫在初始化,還有資料要LL,哎,艹!;
貼一發自己的挫code…

#include<cstdio>
#include<iostream>
#include<queue>
#include<string.h> #include<string> #include<map> #include<algorithm> using namespace std; #define LL long long const int N=5e5+10; struct asd{ int to; LL w; int next; }; asd q[N*4]; int head[N*4],tol; int n,m; map<string,int>mp; int tot; int Getpoint(string ss) { if
(mp.find(ss)!=mp.end()) return mp[ss]; return mp[ss]=++tot; } void init() { memset(head,-1,sizeof(head)); mp.clear(); tol=0; tot=0; } void add(int a,int b,int c) { q[tol].to=b; q[tol].w=c; q[tol].next=head[a]; head[a]=tol++; } typedef pair<int,int> PP; queue<PP>que; const int
M=1e5+10; const long long INF=1e15; LL dis[N][2]; bool vis[N][2]; int num[N][2]; LL spfa(int s,int t) { while(!que.empty()) que.pop(); for(int i=1;i<=n;i++) { dis[i][0]=INF; dis[i][1]=INF; vis[i][0]=false; vis[i][1]=false; num[i][0]=0; num[i][1]=0; } dis[s][0]=dis[s][1]=0; num[s][0]=num[s][1]=1; vis[s][0]=vis[s][1]=true; que.push(make_pair(s,0)); que.push(make_pair(s,1)); while(!que.empty()) { PP u=que.front(); que.pop(); vis[u.first][u.second]=0; for(int v=head[u.first];v!=-1;v=q[v].next) { int i=q[v].to; if(u.second==1) { if(dis[i][1]>dis[u.first][u.second]+q[v].w) { dis[i][1]=dis[u.first][u.second]+q[v].w; if(!vis[i][1]) { vis[i][1]=1; num[i][1]++; if(num[i][1]>=tot) return -1; que.push(make_pair(i,1)); } } } else { if(dis[i][0]>dis[u.first][u.second]+q[v].w) { dis[i][0]=dis[u.first][u.second]+q[v].w; if(!vis[i][0]) { vis[i][0]=1; num[i][0]++; if(num[i][0]>=tot) return -1; que.push(make_pair(i,0)); } } if(dis[i][1]>dis[u.first][u.second]+q[v].w/2) { dis[i][1]=dis[u.first][u.second]+q[v].w/2; if(!vis[i][1]) { vis[i][1]=1; num[i][1]++; if(num[i][1]>=tot) return -1; que.push(make_pair(i,1)); } } } } } if(dis[t][1]==INF) return -1; return dis[t][1]; } int main() { while(~scanf("%d%d",&n,&m)) { string x,y; int w; init(); for(int i=0;i<m;i++) { cin>>x>>y>>w; int xx=Getpoint(x); int yy=Getpoint(y); //printf("%d %d\n",xx,yy); add(xx,yy,w); } cin>>x>>y; if(mp.find(x)==mp.end()||mp.find(y)==mp.end()) { puts("-1"); continue; } int s=Getpoint(x); int t=Getpoint(y); //printf("%d %d\n",s,t); printf("%lld\n",spfa(s,t)); } return 0; }

相關推薦

HDU 3499短路

題意: 給你一幅圖,然後起點終點,然後有一個條件是可以使某條邊的花費減半,求最短路的最小花費。 思路: (來自大哥) 最短路的時候多一維,途中是否有花費減半的邊; 然後轉移,如果上一條有減半的,這一條一定只能轉移到不能減半,上一條沒有減半的,這一條可以

暢通工程續 HDU-1874短路

題目描述: 某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人

HDU 1385 Minimum Transport Cost (輸出字典序小路徑)短路

<題目連結> 題目大意:給你一張圖,有n個點,每個點都有需要繳的稅,兩個直接相連點之間的道路也有需要花費的費用。現在進行多次詢問,給定起點和終點,輸出給定起點和終點之間最少花費是多少,並且輸出最少花費所走的路徑,如果有多條路徑花費最少,則輸出字典序最小的那條。 解題分析: 輸出最短路的路徑問

HDU-1599-find the mincost route短路無向圖小環

find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4341 

短路Floyd演算法模板 講解 + 例題 HDU 1874 暢通工程續 求兩點間短路

【最短路】【Floyd演算法】【模板】講解 + 例題 HDU 1874 暢通工程續 Floyd演算法講解 適用情況:多源多匯最短路(即求任意兩點間的最短路) 複雜度: O(v^3) 思想: DP 通過列舉中間點來優化它的時間複雜度 d[

差分約束系統短路spfaCDOJ1646 窮且益堅, 不墜青雲之誌。

put pac 時間復雜度 edge 系列 string pri class emp 求一個有n個元素的數列,滿足任意連續p個數的和不小於s, 任意連續q個數的和不大於t。 令sum[i]表示前i項的和(0<=i<=n,sum[0]=0) 那麽題目的條件可轉化為

短路spfahdu6071 Lazy Running

spa ima 大於 str turn set pair image pty 給你一個4個點的環,問你從2號點出發, 再回到2號點,長度>=K的最短路是多少。環上的邊長度不超過30000。 跑出來所有dis(2,j)以後,然後for一遍j,根據dis(2,j)+t*

短路求兩點間短路徑的改進的Dijkstra算法及其matlab實現

inf 效率 func 圖論 表示圖 function nes 航空航天 ogr 代碼來源:《圖論算法及其matlab實現》(北京航空航天出版社) P18 書中提出了基於經典Dijkstra算法改進的兩種算法。 其中算法Ⅱ的效率較高。 代碼如下: 1 functio

短路求兩點間短路的Floyd算法及其matlab實現

以及 pre 實現 style div 是否 log inf 表示 代碼來源:《圖論算法及其matlab實現》(北京航空航天出版社) P22 此代碼返回第一個點和最後一個點之間最短路徑,以及最短路徑的長度。 代碼如下: 1 function [P,u ]

短路大可靠路的算法及其matlab實現

war for 文件 輸出 jvm spa zeros 頂點 代碼 內容來源:《圖論算法及其matlab實現》(北京航空航天出版社) P34 【算法用途】 求圖中兩頂點間的最大可靠路。 代碼

短路流星雨

dijk code col == eat include 最短 左右 位置 牛去看流星雨,不料流星掉下來會砸毀上下左右中五個點。每個流星掉下的位置和時間都不同,求牛能否活命,如果能活命,最短的逃跑時間是多少? 註意牛可以從300以外的坐標走 1 #include <

短路白銀蓮花池

empty 表示 觀察 可能 string 路徑 tput farmer 分割 Description Farmer John 建造了一個美麗的池塘,用於讓他的牛們審美和鍛煉。這個長方形的池子被分割成了 M 行和 N 列( 1 ≤ M ≤ 30 ; 1 ≤ N ≤ 30 )

短路二分圖匹配樹形背包DPDay 10.8

void second eof 最小 span har mes find names T1 最短路 1 #include <cstdio> 2 #include <queue> 3 #include <iostream>

亂搞/分治短路線段樹Day 10.24

tdi prior 做的 continue void 之間 sizeof queue oid 1、斜率 可以證明如果兩點之間還有一點的話那麽原來的兩個點連線一定不會是最大斜率 然後我就寫了個沙茶分治………… 其實根據上面的推論只用枚舉相鄰的兩個點,掃一遍就可以了 1 #

短路HDU2680:Choose the best route

namespace src this test least rri sed chan 路徑 Description One day , Kiki wants to visit one of her friends. As she is liable to cars

1295. [SCOI2009]長距離短路

ace out 字符 spf 輸出 int con using content Description windy有一塊矩形土地,被分為 N*M 塊 1*1 的小格子。 有的格子含有障礙物。 如果從格子A可以走到格子B,那麽兩個格子的距離就為兩個格子中心的歐幾裏德距離

[NOIP2017] 逛公園 短路強連通分量

size def con tar 出現 typedef esp pair string 題目分析: 首先考慮無數條的情況。出現這種情況一定是一條合法路徑經過了$ 0 $環中的點。那麽預先判出$ 0 $環中的點和其與$ 1 $和$ n $的距離。加起來若離最短路徑不超過$ k

LOJ2316. 「NOIP2017」逛公園DP短路思維

LINK 思路 因為我想到的根本不是網上的普遍做法 所以常數出奇的大,而且做法極其暴力 可以形容是帶優化的大模擬 進入正題: 首先一個很顯然的思路是如果在合法的路徑網路裡面存在零環是有無陣列解的 然後這個直接對所有邊權是0的邊進行一次toposort看看有沒有點沒有被訪問到 然後剩下的dp怎麼

RQNOJ86智捅馬蜂窩短路

題目大意: 題目連結:http://www.rqnoj.cn/problem/86 一個座標系上有 n n