COGS 2507. 零食店
【題目描述】
? ?
? ?成功找到了學長之后學姐感覺到有些餓,于是決定去附近的零食店給自己和學長買些零食。
? ?焦作市的有n家零食店,由m條道路連接著這些零食店,每條道路都有自己的長度l,每家零食店都有自己的消費指數。
? ?由于學姐是個窮B,所以去買零食的路上不能經過某些消費指數超過一定限度的店。
? ?同時由于學姐體力有限,所以去買零食的過程中走的路程不能太長。
? ?想來想去學姐決定去問學長買什么零食比較好,反正到最后都是學長吃╮(╯_╰)╭
? ?在去問之前,學姐準備先做好準備,她把焦作市(所有零食店)的地圖給了你,希望你能編出一個程序快速回答她從某個零食店出發,在上述限制下有多少家零食店可供她挑選。
【輸入格式】
? ?第一行三個正整數n,m,q,分別代表零食店數,道路數和詢問數。
? ?接下來一行n個正整數,第i個正整數vi代表第i家零食店的消費指數。
? ?接下來m行,第i行三個正整數x,y,l,代表第i條道路連接編號為x和y的兩個零食店,長度為l。
? ?接下來q行第i行三個正整數s,c,d,代表第i個詢問要求從s出發,所經過的零食店的消費指數不能超過c(除了起點和終點以外),且行走路程不超過d。
【輸出格式】
? ?一共q行,第i行一個整數代表在第i個詢問的要求下有多少家零食店可供學姐挑選。
【樣例輸入】
5 5 2 1 2 3 4 5 1 2 1 1 3 4 2 3 2 1 4 3 2 5 1 1 1 3 2 1 2【樣例輸出】
2 3【提示】
樣例中第一個詢問能去編號為2/4的零食店。
第二個詢問能去編號為1/3/5的零食店。
對于40%的數據,n≤10,m≤20,q=1。
對于70%的數據,m≤500,q≤10000。
對于100%的數據,n≤100,m≤10000,q≤1000000,vi,c,d≤10^9,1≤x,y,s≤n,l≤10^6。
?
題解:
考慮設狀態dp[k][i][j],表示在不用點權超過k的點下i到j的最短路,那么顯然我們可以枚舉點權為k的點來更新狀態,dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][h]+dp[k-1][h][j])。也就是說dp[k]是由dp[k-1],轉移過來,通過枚舉點權為k的點來跟新最短路,可以用floyed實現。
?
代碼:(COGS最后三個點是錯誤的)
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #define MAXN 120 #define inf 10000000000000 #define ll long long #define RG register #define ill inline using namespace std; struct node{int id,zhi; }a[MAXN]; int v[MAXN],vv[MAXN],vvv[MAXN],kk; ll dp[MAXN][MAXN][MAXN]; int n,m,q;bool cmp(node x,node y){return x.zhi<y.zhi; }int erfen(int x){int l=1,r=kk,mid,ans=0;while(l<=r){mid=(l+r)/2;if(vv[mid]<=x) ans=mid,l=mid+1;else r=mid-1;}return ans; }int main() {scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++) {scanf("%d",&v[i]);vv[i]=v[i];}sort(vv+1,vv+n+1);kk=unique(vv+1,vv+n+1)-vv-1;for(int i=1;i<=n;i++)v[i]=lower_bound(vv+1,vv+kk+1,v[i])-vv;for(int i=1;i<=n;i++){a[i].id=i,a[i].zhi=v[i];}sort(a+1,a+n+1,cmp);for(int k=0;k<=kk;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dp[k][i][j]=inf;for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);dp[0][x][y]=min(dp[0][x][y],(ll)z);dp[0][y][x]=min(dp[0][y][x],(ll)z);}for(RG int hh=1;hh<=n;hh++){int k=a[hh].zhi;for(RG int i=1;i<=n;i++)for(RG int j=1;j<=n;j++){if(i==j) continue;dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][a[hh].id]+dp[k-1][a[hh].id][j]);}}for(RG int i=1;i<=q;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);int hh=erfen(y),ans=0;for(RG int i=1;i<=n;i++){if(i==x) continue;if(dp[hh][x][i]<=z) ans++;}printf("%d\n",ans);}return 0; }?
轉載于:https://www.cnblogs.com/renjianshige/p/7428988.html
總結
以上是生活随笔為你收集整理的COGS 2507. 零食店的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven工程 报 Diamond ty
- 下一篇: Error occurred while