HDU 2066 一个人的旅行
生活随笔
收集整理的這篇文章主要介紹了
HDU 2066 一个人的旅行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
求最短路,以草兒所在的地方設為0,當做源點,草兒臨近的城市到草兒的距離設為0
這里有一點要注意:并不是1~N的城市都出會出現,所以我用city數組來存儲出現過的城市編號,
如city[i]=1表示 i 出現在數據里,這樣就減少不必要的遍歷。
?
#include <iostream> #include <algorithm> #include <string.h> #include <stdio.h> #include <string> #include <vector> #include <queue>using namespace std; const int maxn=0x3f3f3f3f;int road[1010][1010];//road[i][j]表示i與j的距離(這里指進過該條路的時間) int dis[1010];//dis[i]表示i點到源點1的最短路徑大小 int vis[1010];//vis[i]=1表示節點i已經求過到源點的單源最短路徑 int city[1010];//city[i]=1表示存在該城市,即該城市在數據里出現過 vector<int> link[1010];//link[i]表示i與哪些點連接 vector<int> goal;//存儲喜歡去的城市。 int T,S,D; int a,b,c,t;struct Node{int u,dis;bool operator<(const Node tmp) const{return dis>tmp.dis; //優先級序列默認的是最先取出的是“最大的”。 }//如果按從小到大排,則優先級隊列取最大的。//如果從大到小排,則優先級隊列取最小的。 };void dijkstra(){priority_queue<Node> q;Node tmp,a;memset(dis,maxn,sizeof(dis));memset(vis,0,sizeof(vis));dis[0]=0;city[0]=1;a.u=0;a.dis=0;q.push(a);while(!q.empty()){tmp=q.top();q.pop();int idx=tmp.u;vis[idx]=1;for(int k=0; k<link[idx].size(); k++) {int v=link[idx][k];if(v!=idx && !vis[v]) {if(dis[idx]+road[idx][v]<dis[v]) {dis[v]=dis[idx]+road[idx][v];a.u=v;a.dis=dis[v];q.push(a);}}}} }int main() {while(scanf("%d%d%d",&T,&S,&D)!=EOF) {//U.clear();memset(road,0,sizeof(road));memset(city,0,sizeof(city));goal.clear();for(int i=0; i<1010; i++)link[i].clear();for(int i=0; i<T; i++) {scanf("%d%d%d",&a,&b,&c);if(!road[a][b]) {city[a]=1;city[b]=1;road[a][b]=c;road[b][a]=c;link[a].push_back(b);link[b].push_back(a);} else if(c<road[a][b]) {road[a][b]=c;road[b][a]=c;}}for(int i=0; i<S; i++) {scanf("%d",&t);link[0].push_back(t);}for(int i=0; i<D; i++) {scanf("%d",&t);goal.push_back(t);}dijkstra();int mintime=maxn;for(int i=0; i<D; i++) {int v=goal[i];mintime=min(mintime,dis[v]);}printf("%d\n",mintime);}return 0; }?
?
轉載于:https://www.cnblogs.com/chenxiwenruo/p/3280472.html
總結
以上是生活随笔為你收集整理的HDU 2066 一个人的旅行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于织梦系统不支持php中GD库的问题
- 下一篇: 字符串之移位