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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Luogu1821][USACO07FEB]银牛派对Silver Cow Party

發布時間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Luogu1821][USACO07FEB]银牛派对Silver Cow Party 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由題意可知,我們需要求的是很多個點到同一個店的最短距離,然后再求同一個點到很多個點的最短距離。
對于后者我們很好解決,就是很經典的單源最短路徑,跑一邊dijkstra或者SPFA即可。
然而對于前者,我們應該怎么解決呢?難道我們需要求一邊Floyd?當然不可能!\(O(n^3)\)的時間復雜度,對于我們的\(n<=1000\)是果斷要超時的。
深入分析,對于一張圖,A到B的最短距離,應該等于B到A,在反轉一張圖以后的最短距離。所謂反轉一張圖,就是把變得方向調轉。這一點是很顯然的!
因此,對于問題一,我們只需要把圖反轉,然后求那個點到其它的最短距離即可。

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define rep(i,a,n) for(register int i=(a);i<=(n);++i) #define per(i,a,n) for(register int i=(a);i>=(n);--i) #define fec(i,x) for(register int i=head[x];i;i=Next[i]) #define debug(x) printf("debug:%s=%d\n",#x,x) #define mem(a,x) memset(a,x,sizeof(a)) template<typename A>inline void read(A&a){a=0;A f=1;int c=0;while(c<'0'||c>'9'){c=getchar();if(c=='-')f*=-1;}while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}a*=f;} template<typename A,typename B>inline void read(A&a,B&b){read(a);read(b);} template<typename A,typename B,typename C>inline void read(A&a,B&b,C&c){read(a);read(b);read(c);}const int maxn=1000+7,maxm=100000+7,INF=0x7f7f7f7f; int u[maxm],v[maxm],w[maxm],Next[maxm],head[maxn],tot; int u2[maxm],v2[maxm],w2[maxm],Next2[maxm],head2[maxn],tot2; int n,m,p,x,y,z,ans; int dist1[maxn],dist2[maxn]; bool visit[maxn];inline void addedge(int x,int y,int z){u[++tot]=x;v[tot]=y;w[tot]=z;Next[tot]=head[x];head[x]=tot; } inline void addedge2(int x,int y,int z){u2[++tot2]=x;v2[tot2]=y;w2[tot2]=z;Next2[tot2]=head2[x];head2[x]=tot2; }void Dijkstra(int *u,int *v,int *w,int *head,int *Next,int *dist,int s){mem(visit,0);dist[s]=0;rep(i,1,n){int Min=INF,x;rep(i,1,n)if(!visit[i]&&dist[i]<Min)Min=dist[i],x=i;visit[x]=1;fec(i,x)if(!visit[v[i]]&&dist[v[i]]>dist[x]+w[i])dist[v[i]]=dist[x]+w[i];} }void Init(){read(n,m,p);rep(i,1,m){read(x,y,z);addedge(x,y,z);addedge2(y,x,z); } }void Work(){mem(dist1,0x7f);mem(dist2,0x7f);Dijkstra(u,v,w,head,Next,dist1,p);Dijkstra(u2,v2,w2,head2,Next2,dist2,p);rep(i,1,n)ans=max(ans,dist1[i]+dist2[i]);printf("%d\n",ans); }int main(){Init();Work();return 0; }

轉載于:https://www.cnblogs.com/hankeke/p/USACO07FEB-Silver_Cow_Party.html

總結

以上是生活随笔為你收集整理的[Luogu1821][USACO07FEB]银牛派对Silver Cow Party的全部內容,希望文章能夠幫你解決所遇到的問題。

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