日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

齐头并进(51Nod-1649)

發(fā)布時(shí)間:2025/3/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 齐头并进(51Nod-1649) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

在一個(gè)叫奧斯汀的城市,有n個(gè)小鎮(zhèn)(從1到n編號(hào)),這些小鎮(zhèn)通過(guò)m條雙向火車鐵軌相連。當(dāng)然某些小鎮(zhèn)之間也有公路相連。為了保證每?jī)蓚€(gè)小鎮(zhèn)之間的人可以方便的相互訪問(wèn),市長(zhǎng)就在那些沒(méi)有鐵軌直接相連的小鎮(zhèn)之間建造了公路。在兩個(gè)直接通過(guò)公路或者鐵路相連的小鎮(zhèn)之間移動(dòng),要花費(fèi)一個(gè)小時(shí)的時(shí)間。

現(xiàn)在有一輛火車和一輛汽車同時(shí)從小鎮(zhèn)1出發(fā)。他們都要前往小鎮(zhèn)n,但是他們中途不能同時(shí)停在同一個(gè)小鎮(zhèn)(但是可以同時(shí)停在小鎮(zhèn)n)。火車只能走鐵路,汽車只能走公路。

現(xiàn)在請(qǐng)來(lái)為火車和汽車分別設(shè)計(jì)一條線路;所有的公路或者鐵路可以被多次使用。使得火車和汽車盡可能快的到達(dá)小鎮(zhèn)n。即要求他們中最后到達(dá)小鎮(zhèn)n的時(shí)間要最短。輸出這個(gè)最短時(shí)間。(最后火車和汽車可以同時(shí)到達(dá)小鎮(zhèn)n,也可以先后到達(dá)。)

輸入

單組測(cè)試數(shù)據(jù)。
第一行有兩個(gè)整數(shù)n 和 m (2≤n≤400, 0≤m≤n*(n-1)/2) ,表示小鎮(zhèn)的數(shù)目和鐵軌的數(shù)目。
接下來(lái)m行,每行有兩個(gè)整數(shù)u 和 v,表示u和v之間有一條鐵路。(1≤u,v≤n, u≠v)。
輸入中保證兩個(gè)小鎮(zhèn)之間最多有一條鐵路直接相連。

輸出

輸出一個(gè)整數(shù),表示答案,如果沒(méi)有合法的路線規(guī)劃,輸出-1。

輸入樣例

4 2
1 3
3 4

輸出樣例

2

思路:兩遍?Dijkstra 求兩次的最大值即可

源程序

#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 1000+5; const int dx[] = {-1,1,0,0}; const int dy[] = {0,0,-1,1}; using namespace std;int n,m; struct Edge { //邊int from;//下一條邊的編號(hào)int to;//邊到達(dá)的點(diǎn)int dis;//邊的長(zhǎng)度Edge(int f,int t,int d) { //構(gòu)造函數(shù)from=f;to=t;dis=d;} };struct HeapNode { //Dijkstra用到的優(yōu)先隊(duì)列的結(jié)點(diǎn)int dis;//點(diǎn)到起點(diǎn)距離int u;//點(diǎn)的序號(hào)HeapNode(int a,int b) {dis=a;u=b;}bool operator < (const HeapNode &rhs) const {return dis > rhs.dis;} };struct Dijkstra {int n,m;//點(diǎn)數(shù)、邊數(shù),均從0開(kāi)始vector<Edge> edges;//邊列表vector<int> G[N];//每個(gè)結(jié)點(diǎn)出發(fā)的邊的編號(hào)bool vis[N];//是否走過(guò)int dis[N];//起點(diǎn)s到各點(diǎn)的距離int p[N];//從起點(diǎn)s到i的最短路中的最后一條邊的編號(hào)void init(int n) {//初始化this->n = n;for(int i=0; i<n; i++) //清空鄰接表G[i].clear();edges.clear();//清空邊列表}void AddEdge(int from,int to,int diss) {//添加邊,若為無(wú)向圖,調(diào)用兩次edges.push_back(Edge(from,to,diss));m=edges.size();//邊的個(gè)數(shù)G[from].push_back(m-1);//添加至邊列表}int dijkstra(int s) {//求s到所有點(diǎn)的距離memset(dis,INF,sizeof(dis));memset(vis,false,sizeof(vis));dis[s]=0;priority_queue<HeapNode> Q;//優(yōu)先隊(duì)列Q.push(HeapNode(0,s));while(!Q.empty()) {HeapNode x=Q.top();Q.pop();int u=x.u;if(vis[u])//若已被訪問(wèn)continue;vis[u]=true;//標(biāo)記為已訪問(wèn)for(int i=0; i<G[u].size(); i++) { //枚舉所有與當(dāng)前點(diǎn)相連的邊Edge &e=edges[G[u][i]];if(dis[e.to] > dis[u]+e.dis) {//更新距離dis[e.to] = dis[u]+e.dis;p[e.to]=G[u][i];Q.push(HeapNode(dis[e.to],e.to));}}}return dis[n];} } DJ; int mp[N][N]; int main() {scanf("%d%d",&n,&m);DJ.init(n);//初始化for(int i=0; i<m; i++) {int x,y;scanf("%d%d",&x,&y);mp[x][y]=1;mp[y][x]=1;//無(wú)向圖添邊兩次DJ.AddEdge(x,y,1);DJ.AddEdge(y,x,1);}int res=DJ.dijkstra(1);if(res==INF||m==(n*(n-1))/2)printf("-1\n");else{DJ.init(n);for(int i=1;i<=n;++i){mp[i][i]=1;for(int j=1;j<=n;++j){if(!mp[i][j]){DJ.AddEdge(i,j,1);DJ.AddEdge(j,i,1);}}}if(DJ.dijkstra(1)==INF)printf("-1\n");else{res=max(res,DJ.dijkstra(1));printf("%d\n",res);}}return 0; }

?

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的齐头并进(51Nod-1649)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。