POJ - 3268 Silver Cow Party(最短路)
生活随笔
收集整理的這篇文章主要介紹了
POJ - 3268 Silver Cow Party(最短路)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出n個點以及m條單項路徑和一個點x,設從x點到i的距離及從i回到x點的距離分別為d1和d2,求d1+d2的最大值(1<=i<=n)
題目分析:看到這個題的第一反應是floyd,果不其然的TLE了,因為n是1000,n的三次方就到了1e9,不超時才怪....
然后想到spfa,從x點到i點的距離d1只要對x求一次最短路就行了,問題是從i點到x點的距離該怎么處理?總不至于求n次最短路
徑然后挨個判斷吧?這樣肯定會超時。這里有一個很巧妙的方法,想出來就基本上沒有問題了,就是利用鄰接矩陣來存儲邊的信
息,等求出d1后,將這個矩陣轉置一下,然后在求一次以x點為起點的最短路徑,這樣結果就是每個點到x點的最短路徑了。
因為當矩陣轉置之后,每條單向邊的方向全部取反,所以這個時候對于x點求最短路徑,和處理前對于每個點求最短路徑的效果
是相同的,都求的是i點到x點的最短路徑。
注意:這個題中我用ans數組儲存了d1,然后在求一次spfa后的距離d就相當于d2
上代碼:
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<sstream> #include<cmath> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;int n,m,x;int maze[N][N];int d[N];int ans[N];bool vis[N];void spfa(int x) {memset(vis,false,sizeof(vis));memset(d,inf,sizeof(d)); vis[x]=true;d[x]=0;queue<int>q;q.push(x);while(!q.empty()){int tem=q.front();q.pop();vis[tem]=false;for(int i=1;i<=n;i++){if(d[i]>d[tem]+maze[tem][i]){d[i]=d[tem]+maze[tem][i];if(!vis[i]){vis[i]=true;q.push(i);}}}} }int main() { // freopen("input.txt","r",stdin);while(scanf("%d%d%d",&n,&m,&x)!=EOF){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){maze[i][j]=i==j?0:inf;}for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);maze[a][b]=c;}spfa(x);for(int i=1;i<=n;i++)ans[i]=d[i];for(int i=1;i<=n;i++)for(int j=1;j<i;j++)swap(maze[i][j],maze[j][i]);spfa(x);int mmax=0;for(int i=1;i<=n;i++){if(ans[i]!=inf&&d[i]!=inf)mmax=max(mmax,ans[i]+d[i]);}cout<<mmax<<endl;}return 0; }?
總結
以上是生活随笔為你收集整理的POJ - 3268 Silver Cow Party(最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 3252 Round Num
- 下一篇: 数位dp模板+理解