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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACM知识竞)赛 之 SDUT3034 炸学校(最短路Dijkstra)

發布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACM知识竞)赛 之 SDUT3034 炸学校(最短路Dijkstra) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

炸學校

Time Limit: 2000ms?? Memory limit: 65536K??有疑問?點這里^_^

題目描述

“小兒么小二郎,背著那炸彈炸學校,不怕那太陽曬,也不怕那風雨狂。”估計這首歌我們大家都耳熟能詳了。
于是就有一群小學生們商量著炸學校。要把本市的小學的都給炸掉。于是他們商量好了一個出發點source與集合點sink。然后有無數個小學生,n-2個學校,每個小學生都從出發點出發,負責背著一個炸彈,然后把炸彈偷偷放置在一個學校里,然后返回到集合點。 由于這群小學生們還急著回去玩擼啊擼,所以他們想盡快把所有學校都炸完。這里有m條無向路,每條路都連接著u和v這兩個學校,經過這條路的時間花費為t。這些小學生只能從這些路中經過。他們同時從出發點出發,他們想知道炸完所有學校并且都回到集合點的最少需要多長時間。

輸入

第一行為一個整數T,表示T組測試數據。

第二行為整數n3<=n<=1000),代表學校的數量(包括出發點和集合點),還有整數mm<10^5),表示有多少條無向路。

然后接下來是m行,每一行的三個整數分別是uvt0<=uv?u=v?0<=t<=10^5

然后給出兩個整數sourcesink,分別代表出發點和集合點。(0<=sourcesink)。

輸入數據保證可以炸毀所有學校,并且可以到達集合點。不保證沒有重邊。

輸出:

輸出

對于第x組數據輸出一行“Case #x:”,然后是一個整數表示最少需要的時間。

示例輸入

1 5 5 1 0 1 1 2 3 1 3 3 4 2 2 3 4 1 4 2

示例輸出

Case #1: 9

提示


炸完所有學校的最短時間,即是最慢的那一個人炸完所用的時間,每個點求一次最短路,果斷的TLE了,,,,其實兩遍即可,然后記下到每個點的距離 #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stdlib.h> #include <queue> #include <algorithm> using namespace std; const int MAX = 999999; int a[1010][1010]; int b[1010],v[1010]; int flag; int v1[1010]; int v2[1010]; int n,m; void Dijkstra(int s) {int k;memset(b,0,sizeof(b));for(int i=0; i<n; i++)v[i]=a[s][i];b[s]=1;v[s]=0;int min=0;for(int i=0; i<n-1; i++){min=MAX;for(int j=0; j<n; j++){if(!b[j]&& min > v[j]){min=v[j];k=j;}}if(min==MAX)break;b[k]=1;for(int j=0; j<n; j++){if(!b[j] && v[j] > v[k]+a[k][j]){v[j]=v[k]+a[k][j];}}}if(flag){for(int i=0;i<n;i++)v1[i]=v[i];}else{flag++;for(int i=0;i<n;i++)v2[i]=v[i];}} int main() {int T;scanf("%d",&T);for(int r=1; r<=T; r++){flag=0;memset(a,MAX,sizeof(a));for(int i=0;i<n;i++)a[i][i]=0;scanf("%d%d",&n,&m);for(int i=0; i<m; i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);if(w<a[u][v]){a[u][v]=w;a[v][u]=w;}}int s,e;scanf("%d%d",&s,&e);Dijkstra(s);Dijkstra(e);int ans=-1;for(int i=0;i<n;i++){if(ans<v1[i]+v2[i])ans=v1[i]+v2[i];}printf("Case #%d: %d\n",r,ans);}return 0; }


總結

以上是生活随笔為你收集整理的ACM知识竞)赛 之 SDUT3034 炸学校(最短路Dijkstra)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。