小明所在的世界上一共有n個城市,城市間有m條雙向道路。小明現在在城市1,他想到位於城市n的小韓隆家詢問他為什麼沒有將自己的五三復原完成。由於小韓隆手下有許多小弟,小明擔心自己可能再也回不來,所以他要先到達k個城市(編號為2到k+1)叫上自己的小弟,再到小韓隆家 。一 個城市有且只有乙個小弟。但是有的小弟也曾被小明嘲諷過,不願為小明賣命,所以小明需要先叫上其他的某些小弟才能叫到這個小弟。小明想要盡早的叫上所有k個小弟向小韓隆復仇,但是智力所限,他無法算出他找完k個小弟之後到小韓隆家的最少時間。於是他找到了你,想讓你幫他算算。
第一行為三個整數n、m、k,分別表示城市的數量、雙向道路的數量和小弟的數量。接下來的m行每行三個整數u、v、i,表示一條路的兩個端點和通過所需的時間。第m+2行為乙個整數q,表示小弟有q個依賴關係。接下來q行每行兩個整數x、y,表示要叫位於城市y的小弟必須先叫位於城市x的小弟。注意:由於小明十分受人厭惡,乙個小弟可能依賴於不止乙個小弟。經過乙個城市不一定要立刻叫上該城市的小弟。
乙個整數,表示小明叫上所有k個小弟後到達小韓隆家的最短時間。
5 7 3
1 2 3
2 3 4
3 1 2
1 4 3
4 5 5
2 5 3
5 3 2
12 4
16
【樣例解釋】小明行走的路線1->2->1->4->1->3->5。
對於20%的資料:n<=10,k<=2。
對於40%的資料:n<=1000,k<=10。
對於另外30%的資料,小明覺得小韓隆太鶸,不屑叫小弟。
對於100%的資料:1<= n<=20000,1<=m<=200000,0<=k<=20,0<=q<=100000,保證沒有重邊和自環、城市間兩兩連通、答案在 int 範圍中。
n、m很大,都跑一遍最短路會炸。參考到k很小,我們可以想到:其實最多也只是跑21個單源最短路,因為剩下的點和這道題沒有直接關係。
首先我們要確定的是,必須從起點(1)出發,帶上每個小弟(k個),到達終點(n),才能算作成功。至少需要經過k+2個點。
那麼,我們要做的就是安排這個順序,起點和終點不能動,只能安排中間k個小弟的順序。
在保證都能叫到小弟的情況下,可能會有多種走的方式,所以不能用拓撲排序,例如題解有:
所以,只要全排列中間幾個小弟,檢測是否合理,兩兩查詢相鄰最短路即可,我怕資料不過,用記憶化記一下。
資料比較大,只能用鄰接表存圖;存小弟的關係用vector來存,省時省力。
接下來列出1、2...k、k+1、n的全排列(一共k+2個數,不要搞錯,懶,直接用next_permutation)。
對每一種排列判斷,一開始覺得是不是要像並查集那樣查(就是把它所有長輩都查一遍,是不是在他前面),後來發現只用查父親就可以了,因為有父親的時候一定也查過了父親的父親,以此類推。從頭查,到了乙個數標記,如果他父親沒出現在前面就return。
找所有兩兩相鄰的(全排列中)點的最短時間,他們的和與ans比,取小的即可。
輸出ans即為答案。
#include#include#include#include#include#includeusing namespace std;
const int inf = 0x3f3f3f3f,maxm=400002,maxn=20001;
struct edgee[maxm];
vectorf[maxn];//接i小弟的時候必須有f[i]小弟
//book和vis是表示訪問狀態、cnt全排列用、 dis[i][j]表示從i~j的最短時間
int n,m,k,q,x,y,u,s,v,w,i,j,r,minn,nume=0,ans=inf;
int book[maxn],vis[maxn],head[maxm],dis[25][maxn],cnt[21];
struct cmp
};//建邊函式,將同乙個出發點的邊給集合起來。
void addedge(int from,int to,int dis)
bool check() }}
void find(int u,int v,int l)
int main()
cin >> q;
for(i=0;i> x >> y;
f[y].push_back(x);//要注意可以多個大哥
} do
ans=min(ans,p);//是不是最短時間?
}while(next_permutation(cnt+1,cnt+k+1)); //全排列
cout << ans;
return 0;
}
170 ActionBar主題配置
我們的androidmnifest.xml 清單檔案裡 theme 主題條目的 然後我們進這個style看看 這個主題 如果我們不想要actionbar,我們可以給他乙個 noactionbar 的主題 我們來個自定義actionbar 的主題,然後給乙個 parent,就是預設的 light主題 ...
XDOJ 170 複試篩選
考研初試成績公布後需要對m個學生的成績進行排序,篩選出可以進入複試的前n名學生。排序規則為首先按照總分排序,總分相同則按英語單科成績排序,總分和英語成績也相同時考號小者排在前面。現給出這m個學生的考研初試成績,請篩選出可以進入複試的n名學生並按照排名從高到低的順序依次輸出。輸入為m 1行,第一行為兩...
lintcode 170 旋轉鍊錶
給定乙個鍊錶,旋轉鍊錶,使得每個節點向右移動k個位置,其中k是乙個非負數 給出鍊錶1 2 3 4 5 null和k 2返回4 5 1 2 3 null整體思路是先遍歷一遍鍊錶,求出鍊錶的長度size,隨後size和k進行取餘得到k,取餘的目的是得到需要移動的最小距離。然後我們取倒數第k個節點,並且與...