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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj 3411 1724

發布時間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 3411 1724 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:http://poj.org/problem?id=3411

題意:n 個城市,m 條路,每條路都有兩種情況的費用,一種是 在 b 城市付費 r,一種是提前在 c 城市付費 p 元,問從 1 到 n 最小的花費

思路:鄰接表 + dfs

View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #define N 20 6 #define inf 100000000 7 #define _clr(a,val) (memset(a,val,sizeof(a))) 8 9 using namespace std; 10 11 int vis[N]; 12 int head[N]; 13 struct node 14 { 15 int a,b,c,p,r; 16 int next; 17 }point[N]; 18 int n,m; 19 int minn; 20 void dfs(int x,int sum) 21 { 22 if(sum > minn || vis[x] > n) return; // 當一個節點被訪問n次時,就沒必要再訪問了 23 if(x == n) 24 { 25 if(sum < minn) minn = sum; 26 return ; 27 } 28 int t = head[x]; 29 while(t != -1) 30 { 31 vis[point[t].b] ++; 32 if(vis[point[t].c] > 0) dfs(point[t].b,sum + point[t].p); 33 else dfs(point[t].b , point[t].r + sum); 34 vis[point[t].b] --; 35 t = point[t].next; 36 } 37 } 38 int main() 39 { 40 int i; 41 //freopen("data.txt","r",stdin); 42 while(scanf("%d%d",&n,&m) != EOF) 43 { 44 _clr(vis,0); 45 _clr(head,-1); 46 for(i = 0; i < m; i++) 47 { 48 scanf("%d%d%d%d%d",&point[i].a,&point[i].b,&point[i].c,&point[i].p,&point[i].r); 49 point[i].next = head[point[i].a]; 50 head[point[i].a] = i; 51 } 52 minn = inf; 53 vis[1] = 1; 54 dfs(1,0); 55 if(minn == inf) printf("impossible\n"); 56 else printf("%d\n",minn); 57 } 58 return 0; 59 }

題目:http://poj.org/problem?id=1724

題意:n個城市 m 條路,每條路有兩個參數,一個是長度,一個是費用,給出Bob擁有的錢,問從1 到 n在 可以付的起費的情況下的做短路長度

思路:用優先隊列保存加進來的點(在不超過 Bob最多錢的情況下),然后bfs當找到n時就輸出并退出

View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <queue> 5 #include <algorithm> 6 #define N 10010 7 #define inf 100000000 8 #define _clr(a,val) (memset(a,val,sizeof(a))) 9 10 using namespace std; 11 12 struct node 13 { 14 int point; 15 int len; 16 int cost; 17 friend bool operator < (node a,node b) // 定義順序 18 { 19 return a.len > b.len; 20 } 21 }; 22 struct tnode 23 { 24 int f,t,l,c; 25 int next; 26 }eage[N]; 27 int s,d,r; 28 int head[N]; 29 void bfs() 30 { 31 node tem; 32 int flag = 0; 33 tem.point = 1, tem.len = tem.cost = 0; 34 priority_queue<node>qu; 35 qu.push(tem); 36 while(!qu.empty()) 37 { 38 //cout<<"999\n"; 39 node temp = qu.top(); 40 qu.pop(); 41 if(temp.point == d) 42 { 43 printf("%d\n",temp.len); 44 flag = 1; 45 break; //找到了就輸出并退出 46 } 47 int i = head[temp.point]; 48 while(i != -1) 49 { 50 node ttem; 51 ttem.point = eage[i].t, ttem.len = temp.len + eage[i].l, ttem.cost = temp.cost + eage[i].c; 52 if(ttem.cost <= s) 53 { 54 qu.push(ttem); 55 } 56 i = eage[i].next; 57 } 58 } 59 if(!flag) printf("-1\n"); 60 return ; 61 } 62 int main() 63 { 64 int i; 65 //freopen("data.txt","r",stdin); 66 while(scanf("%d%d%d",&s,&d,&r) != EOF) 67 { 68 _clr(head,-1); 69 for(i = 0; i < r; i++) 70 { 71 scanf("%d%d%d%d",&eage[i].f,&eage[i].t,&eage[i].l,&eage[i].c); 72 eage[i].next = head[eage[i].f], head[eage[i].f] = i; 73 } 74 bfs(); 75 } 76 return 0; 77 }

轉載于:https://www.cnblogs.com/fxh19911107/archive/2012/08/07/2627187.html

總結

以上是生活随笔為你收集整理的poj 3411 1724的全部內容,希望文章能夠幫你解決所遇到的問題。

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