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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最短路常用的四种模板(poj1847)

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最短路常用的四种模板(poj1847) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

針對于poj1847這道題,總結一下最短路常用的四種模板.
**

Floyed(O(n^3))

**

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define ll long long #define inf 0x3f3f3f3f using namespace std;const int maxx=1e2+10; int mp[maxx][maxx]; int n,s,e;inline void floyed()//!!!核心代碼 {for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) mp[i][j]=min(mp[i][k]+mp[k][j],mp[i][j]);}} } int main() {scanf("%d%d%d",&n,&s,&e);int num,x;memset(mp,inf,sizeof(mp));for(int i=1;i<=n;i++){scanf("%d",&num);for(int j=1;j<=num;j++){scanf("%d",&x);if(j==1) mp[i][x]=0;else mp[i][x]=1;}}floyed();if(mp[s][e]==inf) cout<<"-1"<<endl;else cout<<mp[s][e]<<endl;return 0; }

**

Dijkstra(O(n^2))

**

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std;const int maxx=1e2+10; int mp[maxx][maxx]; int dis[maxx]; int vis[maxx]; int n,s,e;inline void dijkstra(int u)//核心代碼 {memset(dis,inf,sizeof(dis));memset(vis,0,sizeof(vis));dis[u]=0;for(int k=1;k<=n;k++){int _min=inf,v;for(int i=1;i<=n;i++){if(vis[i]) continue;if(dis[i]<_min) _min=dis[i],v=i;}vis[v]=1;for(int i=1;i<=n;i++){if(mp[v][i]!=inf&&vis[i]==0) dis[i]=min(dis[i],dis[v]+mp[v][i]);}} } int main() {scanf("%d%d%d",&n,&s,&e);int num,x;memset(mp,inf,sizeof(mp));for(int i=1;i<=n;i++){scanf("%d",&num);for(int j=1;j<=num;j++){scanf("%d",&x);if(j==1) mp[i][x]=0;else mp[i][x]=1;}}dijkstra(s);if(dis[e]==inf) cout<<"-1"<<endl;else cout<<dis[e]<<endl;return 0; }

**

Dijkstra(O(nlogn))

**

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std;const int maxx=1e2+10; struct node{int to,v;node(){}node(int a,int b){to=a,v=b;}bool operator<(const node &a)const{return v>a.v;} }; int mp[maxx][maxx]; int dis[maxx]; int vis[maxx]; int n,s,e;inline void dijkstra(int u)//核心代碼 {memset(dis,inf,sizeof(dis));memset(vis,0,sizeof(vis));dis[u]=0;priority_queue<node> q;q.push(node(u,0));while(q.size()){node a=q.top();q.pop();if(vis[a.to]) continue;vis[a.to]=1;for(int i=1;i<=n;i++){if(mp[a.to][i]!=inf&&dis[i]>dis[a.to]+mp[a.to][i]){dis[i]=dis[a.to]+mp[a.to][i];q.push(node(i,dis[i]));}}} } int main() {scanf("%d%d%d",&n,&s,&e);int num,x;memset(mp,inf,sizeof(mp));for(int i=1;i<=n;i++){scanf("%d",&num);for(int j=1;j<=num;j++){scanf("%d",&x);if(j==1) mp[i][x]=0;else mp[i][x]=1;}}dijkstra(s);if(dis[e]==inf) cout<<"-1"<<endl;else cout<<dis[e]<<endl;return 0; }

**

Spfa(未知)

**

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std;const int maxx=1e2+10; int mp[maxx][maxx]; int dis[maxx]; int vis[maxx]; int n,s,e;inline void spfa(int u)//核心代碼 {queue<int> q;memset(vis,0,sizeof(vis));memset(dis,inf,sizeof(dis));vis[u]=1;dis[u]=0;q.push(u);while(q.size()){int v=q.front();q.pop();vis[v]=0;for(int i=1;i<=n;i++){if(mp[v][i]!=inf){if(dis[i]>dis[v]+mp[v][i]){dis[i]=dis[v]+mp[v][i];if(vis[i]==0){vis[i]=1;q.push(i);}}}}} } int main() {scanf("%d%d%d",&n,&s,&e);int num,x;memset(mp,inf,sizeof(mp));for(int i=1;i<=n;i++){scanf("%d",&num);for(int j=1;j<=num;j++){scanf("%d",&x);if(j==1) mp[i][x]=0;else mp[i][x]=1;}}spfa(s);if(dis[e]==inf) cout<<"-1"<<endl;else cout<<dis[e]<<endl;return 0; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的最短路常用的四种模板(poj1847)的全部內容,希望文章能夠幫你解決所遇到的問題。

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