ACM知识竞)赛 之 SDUT3034 炸学校(最短路Dijkstra)
生活随笔
收集整理的這篇文章主要介紹了
ACM知识竞)赛 之 SDUT3034 炸学校(最短路Dijkstra)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
炸學校
Time Limit: 2000ms?? Memory limit: 65536K??有疑問?點這里^_^
題目描述
“小兒么小二郎,背著那炸彈炸學校,不怕那太陽曬,也不怕那風雨狂。”估計這首歌我們大家都耳熟能詳了。于是就有一群小學生們商量著炸學校。要把本市的小學的都給炸掉。于是他們商量好了一個出發點source與集合點sink。然后有無數個小學生,n-2個學校,每個小學生都從出發點出發,負責背著一個炸彈,然后把炸彈偷偷放置在一個學校里,然后返回到集合點。 由于這群小學生們還急著回去玩擼啊擼,所以他們想盡快把所有學校都炸完。這里有m條無向路,每條路都連接著u和v這兩個學校,經過這條路的時間花費為t。這些小學生只能從這些路中經過。他們同時從出發點出發,他們想知道炸完所有學校并且都回到集合點的最少需要多長時間。
輸入
第一行為一個整數T,表示T組測試數據。
第二行為整數n(3<=n<=1000),代表學校的數量(包括出發點和集合點),還有整數m(m<10^5),表示有多少條無向路。
然后接下來是m行,每一行的三個整數分別是u,v,t(0<=u,v,?u!=v,?0<=t<=10^5)
然后給出兩個整數source和sink,分別代表出發點和集合點。(0<=source,sink)。
輸入數據保證可以炸毀所有學校,并且可以到達集合點。不保證沒有重邊。
輸出:
輸出
對于第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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果新专利获授权;谷歌因 反竞争 的安卓
- 下一篇: [Leetcode] 414. 第三大的