在byteland有n個城市(編號從1到n),它們之間通過雙向的道路相連。byteland的國王並不大方,所以,那裡只有n -1條道路,但是,它們的連線方式使得從任意城市都可以走到其他的任何城市。
一天,starhder到了編號為k的城市。他計畫從城市k開始,遊遍城市m1,m2,m3,……,mj(不一定要按這個順序旅遊),其中j個城市都是不同的,並且也與k不同。starhder—— 就像每乙個旅行家一樣,攜帶的錢總是有限的,所以,他要以最短的路程旅行完所有的城市(從城市k開始)。 於是,他請你幫助計算一下,旅遊完上述的城市最短需要多少路程。
輸入引數
第一行輸入兩個整數,即上文中的n和k,以乙個空格隔開。下面的n-1行每行描述一條路,每行輸入3個整數ai,bi,di,相鄰兩個數用乙個空格隔開(1<= ai,bi
<= n,1<= di
<= 1000),ai和bi是用道路直接相連的城市編號,di是這條道路的長度。 第n + 1行輸入乙個整數j,是starhder要旅遊的城市數(1<= j <= n - 1),接下來一行包含j個不同的整數,即m1,m2,……,mj,每兩個相鄰的整數用乙個空格隔開,表示starhder想要去的城市。(1<= mt
<=n,mt 不等於k)。
輸出引數
輸出只有一行,包含乙個整數:starhder旅遊的最短路程。
樣例輸入
4 2
1 2 1
4 2 2
2 3 3
2
1 3
樣例輸出
5
思路:題目中說n個節點總共有n-1條路,所以是乙個棵樹。先用floyd求出各節點之間的最短路徑,然後將不用去的節點去掉,之後就可以只用剩下的節點求出所要去的最短路徑。我用的是暴力搜尋,複雜度有點高。
#include #include #include #include using namespace std;
#define m 1050
#define inf 0xfffffff
int map[m][m],n,k,city;
bool go[m]; //go[i]表示去沒去過城市i
int ans;
void init() }
void floyd() //先求出各城市之間的最短路徑
void dfs(int st,int num,int sum) //用已知最短路徑的圖搜尋求出最小的路程
for(int j=1;j<=n;j++)
}} int main()
floyd();
scanf("%d",&city);
for(int i=0;i
最短路 旅程
題目描述 您曾經帶領著我,穿過我的白天的擁擠不堪的旅程,而到達了我的黃昏的孤寂之境。在通宵的寂靜裡,我等待著它的意義。神即將帶領一些人去他們的孤寂之境,由於這個世界的不穩定,地點之間的有向道路會不定期地毀壞,出於工作準備,神想知道在某些道路毀壞之後某兩點之間的最短路。就是給定乙個有向圖,現有兩個操作...
10 12模擬賽 旅程 最短路
神即將帶領一些人去他們的孤寂之境,由於這個世界的不穩定,地點之間的有向道路會不定期地毀壞,出於工作準備,神想知道在某些道路毀壞之後某兩點之間的最短路。就是給定乙個有向圖,現有兩個操作,操作 1 是刪除一條邊 一條邊可重複刪除 操作 2是詢問兩個點之間的最短路。第 1 行兩個正整數 n,m,分別表示圖...
使用者的旅程
使用者的旅程 1.收集使用者的要求 原始的要求 可以適應於典型的市場活動 銷售獲利 服務 保持客戶。要求的狀態 這時的設計 對應著使用者的某個原始要求,會分解成n個狀態。2.答覆要求 採用頭腦風暴 面對面複核等方式,以雙方都能夠理解的方式,確定每乙個要求的內容和功能。此時應當能夠整理出一些典型的案例...