【Floyed】小萨的烦恼(ssl 1624)
小薩的煩惱
ssl 1624
題目大意:
一個無向圖,可以使其中一條道路的值除以2,求兩個點之間的最短路
原題:
Description
圣誕節又要到了!小薩希望和自己心儀的MM一起出去度過一個浪漫的的圣誕節。他進行了詳盡的準備,找到了N個很適合他們去約會的好地方,但無奈小薩和他的MM都是初三學校,晚上必須回學校上晚修,沒有足夠的時間讓他們走遍每一個地方。迫于無奈,小薩選擇了一個最合適的地方S。小薩打算和他的MM一起步行到那個地方,那樣他們就有很多時間來聊天玩樂,但是無奈時間有限,小薩決定坐公共汽車過去。然而,小薩發覺,自己的錢只夠買一張公共汽車車票了!小薩該怎么辦呢?他找到了你……
【題目描述】
小薩將給出一張地圖,它可以看做一個有N(N<=100)個結點的圖。這張地圖有N個公共汽車站,小薩只可以在這N個汽車站上公共汽車。有些車站之間存在一條雙向通路,無論是公共汽車還是小薩,都只能走這些通路。若兩個車站之間的距離為d,步行所需要的時間為2*d秒,坐公共汽車所需要的時間為d秒。小薩他們只有T秒的時間,他希望你求出他和他的MM出去約會后能否及時趕回來,若不能,則輸出“You are day dreaming!”,否則輸出他們所需要花費的最少時間。
注意:一張公共汽車車票可以使用兩次(只可以搭乘同一輛公共汽車),即可以認為小薩去約會地點的時間和回來的時間相等。
Input
第一行有三個整數N、T、S
接下來是一個N*N的鄰接矩陣。兩兩車站之間的距離不超過10^9。A[I,j]為0表示I和J車站不連通。
Output
若小薩他們不能在限定時間內趕回學校,那么輸出“You are day dreaming!”(不包括引號)
否則,輸出一個整數,為他們所需要花費的最少時間。
Sample Input
4 5 4
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
Sample Output
2
Hint
【數據范圍】
20%的數據:N<=10
100%的數據:N<=70 T<=10^9
解題思路:
這道題很可能想到先找一條最短路,再用貪心的想法來找一條路,但遇到下圖時就會先選1-2-3,折半后就是3+4=7,但選1-2折半后就是6,所以以上想法行不通
我們可以先打一個Floyed,然后枚舉每一條邊來折半,然后分別連接起點和重點再求最小值就行了
代碼:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,s; long long t,ans,a[105][105],b[105][105]; long long minn(long long aa,long long bb) {if (aa<bb) return aa;return bb; } int main() {scanf("%d %lld %d",&n,&t,&s);for (int i=1;i<=n;++i)for (int j=1;j<=n;++j){scanf("%lld",&a[i][j]);//輸入if (!a[i][j]) a[i][j]=1<<30;//不連通if (i==j) a[i][j]=0;//同一個點b[i][j]=a[i][j]*2;//步行}for (int k=1;k<=n;++k)for (int i=1;i<=n;++i)for (int j=1;j<=n;++j)if (k!=i&&k!=j&&i!=j)b[i][j]=minn(b[i][j],b[i][k]+b[k][j]);//Floyedans=1<<30;//預處理for (int i=1;i<=n;++i)for (int j=1;j<=n;++j)ans=minn(ans,a[i][j]+b[1][i]+b[j][s]);//枚舉每一條邊來折半,然后線的兩邊分別連接起點和終點if (ans*2>t) printf("You are day dreaming!");//超時了else printf("%lld",ans*2);//輸出 }總結
以上是生活随笔為你收集整理的【Floyed】小萨的烦恼(ssl 1624)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米签约费翔看乐一加高管 莫非要上演机圈
- 下一篇: 【模拟】正方形