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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1266: [AHOI2006]上学路线route

發(fā)布時間:2024/4/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1266: [AHOI2006]上学路线route 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1266: [AHOI2006]上學(xué)路線route

Description

可可和卡卡家住合肥市的東郊,每天上學(xué)他們都要轉(zhuǎn)車多次才能到達(dá)市區(qū)西端的學(xué)校。直到有一天他們兩人參加了學(xué)校的信息學(xué)奧林匹克競賽小組才發(fā)現(xiàn)每天上學(xué)的乘車路線不一定是最優(yōu)的。 可可:“很可能我們在上學(xué)的路途上浪費(fèi)了大量的時間,讓我們寫一個程序來計(jì)算上學(xué)需要的最少時間吧!” 合肥市一共設(shè)有N個公交車站,不妨將它們編號為1…N的自然數(shù),并認(rèn)為可可和卡卡家住在1號汽車站附近,而他們學(xué)校在N號汽車站。市內(nèi)有M條直達(dá)汽車路線,執(zhí)行第i條路線的公交車往返于站點(diǎn)pi和qi之間,從起點(diǎn)到終點(diǎn)需要花費(fèi)的時間為ti。(1<=i<=M, 1<=pi, qi<=N) 兩個人坐在電腦前,根據(jù)上面的信息很快就編程算出了最優(yōu)的乘車方案。然而可可忽然有了一個鬼點(diǎn)子,他想趁卡卡不備,在卡卡的輸入數(shù)據(jù)中刪去一些路線,從而讓卡卡的程序得出的答案大于實(shí)際的最短時間。而對于每一條路線i事實(shí)上都有一個代價ci:刪去路線的ci越大卡卡就越容易發(fā)現(xiàn)這個玩笑,可可想知道什么樣的刪除方案可以達(dá)到他的目的而讓被刪除的公交車路線ci之和最小。 [任務(wù)] 編寫一個程序: ? 從輸入文件中讀取合肥市公交路線的信息; 計(jì)算出實(shí)際上可可和卡卡上學(xué)需要花費(fèi)的最少時間; ?幫助可可設(shè)計(jì)一個方案,刪除輸入信息中的一些公交路線,使得刪除后從家到學(xué)校需要的最少時間變大,而被刪除路線的ci和最小;向輸出文件輸出答案。

Input

輸入文件中第一行有兩個正整數(shù)N和M,分別表示合肥市公交車站和公交汽車路線的個數(shù)。以下M行,每行(第i行,總第(i+1)行)用四個正整數(shù)描述第i條路線:pi, qi, ti, ci;具體含義見上文描述。

Output

輸出文件最多有兩行。 第一行中僅有一個整數(shù),表示從可可和卡卡家到學(xué)校需要的最短時間。 第二行輸出一個整數(shù)C,表示Ci之和

Sample Input

6 7
1 2 1 3
2 6 1 5
1 3 1 1
3 4 1 1
4 6 1 1
5 6 1 2
1 5 1 4

Sample Output

2
5

HINT

2<=N<=500, 1<=M<=124 750, 1<=ti, ci<=10 000
合肥市的公交網(wǎng)絡(luò)十分發(fā)達(dá),你可以認(rèn)為任意兩個車站間都可以通過直達(dá)或轉(zhuǎn)車互相到達(dá),當(dāng)然如果在你提供的刪除方案中,家和學(xué)校無法互相到達(dá),那么則認(rèn)為上學(xué)需要的最短為正無窮大:這顯然是一個合法的方案。

這個提示我并沒有發(fā)現(xiàn)他有什么用 可能是我太弱了? 顯然 可可要刪除一些邊 不讓卡卡走最短路(心機(jī))? 于是我第一遍就跑A* 找所有最短路 統(tǒng)計(jì)切斷所有最短路的代價之和 結(jié)果只有30分 我真是蠢啊 切斷所有最短路的代價和 不就是最小割嘛? 把所有最短路分離出來 構(gòu)成一個新圖 跑最大流dinic? 1 #include <queue> 2 #include <cstdio> 3 #include <cctype> 4 #include <cstring> 5 6 const int MAXN=510; 7 const int INF=0x3f3f3f3f; 8 9 int n,m; 10 11 int f[MAXN][MAXN],dep[MAXN<<1],cur[MAXN<<1]; 12 13 struct node { 14 int x,y; 15 int val; 16 int fee; 17 }; 18 node e[MAXN*MAXN]; 19 20 struct edge { 21 int to; 22 int val; 23 int next; 24 edge() {} 25 edge(int to,int val,int next):to(to),val(val),next(next){} 26 }; 27 edge Edge[MAXN*MAXN*10]; 28 29 int head[MAXN<<1],tot=1; 30 31 inline void read(int&x) { 32 int f=1;register char c=getchar(); 33 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 34 for(;isdigit(c);x=x*10+c-48,c=getchar()); 35 x=x*f; 36 } 37 38 inline void add(int x,int y,int val) { 39 Edge[++tot]=edge(y,val,head[x]); 40 head[x]=tot; 41 Edge[++tot]=edge(x,0,head[y]); 42 head[y]=tot; 43 } 44 45 inline int min(int a,int b) {return a<b?a:b;} 46 47 inline bool bfs() { 48 std::queue<int> q; 49 for(int i=1;i<=n;++i) cur[i]=head[i],dep[i]=-1; 50 q.push(1);dep[1]=0; 51 while(!q.empty()) { 52 int u=q.front(); 53 q.pop(); 54 for(int i=head[u];i;i=Edge[i].next) { 55 int v=Edge[i].to; 56 if(Edge[i].val&&dep[v]==-1) { 57 dep[v]=dep[u]+1; 58 q.push(v); 59 if(v==n) return true; 60 } 61 } 62 } 63 return false; 64 } 65 66 int dfs(int u,int flow) { 67 if(u==n) return flow; 68 int delat,used=0; 69 for(int&i=cur[u];i;i=Edge[i].next) { 70 int v=Edge[i].to; 71 if(dep[v]==dep[u]+1&&Edge[i].val) { 72 delat=dfs(v,min(Edge[i].val,flow-used)); 73 if(delat) { 74 Edge[i].val-=delat; 75 Edge[i^1].val+=delat; 76 used+=delat; 77 if(used==flow) break; 78 } 79 } 80 } 81 if(used!=flow) dep[u]=-1; 82 return used; 83 } 84 85 inline void dinic() { 86 int ans=0; 87 while(bfs()) ans+=dfs(1,INF); 88 printf("%d\n",ans); 89 return; 90 } 91 92 int hh() { 93 read(n);read(m); 94 memset(f,63,sizeof f); 95 for(int i=1;i<=n;++i) f[i][i]=0; 96 for(int x,y,z,k,i=1;i<=m;++i) { 97 read(e[i].x);read(e[i].y);read(e[i].val);read(e[i].fee); 98 f[e[i].x][e[i].y]=min(e[i].val,f[e[i].x][e[i].y]); 99 f[e[i].y][e[i].x]=f[e[i].x][e[i].y]; 100 } 101 for(int k=1;k<=n;++k) 102 for(int i=1;i<=n;++i) 103 for(int j=1;j<=n;++j) 104 f[i][j]=min(f[i][j],f[i][k]+f[k][j]); 105 printf("%d\n",f[1][n]); 106 for(int i=1;i<=m;++i) { 107 int x=e[i].x,y=e[i].y; 108 if(f[1][x]+e[i].val+f[y][n]==f[1][n]) 109 add(x,y,e[i].fee); 110 if(f[1][y]+e[i].val+f[x][n]==f[1][n]) 111 add(y,x,e[i].fee); 112 } 113 dinic(); 114 return 0; 115 } 116 117 int sb=hh(); 118 int main(int argc,char**argv) {;} 代碼

?

轉(zhuǎn)載于:https://www.cnblogs.com/whistle13326/p/7491964.html

總結(jié)

以上是生活随笔為你收集整理的1266: [AHOI2006]上学路线route的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。