poj 3411 1724
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 1236 Network of
- 下一篇: 《流浪地球》 电影全集