hdu1874 畅通工程续
生活随笔
收集整理的這篇文章主要介紹了
hdu1874 畅通工程续
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
某省自從實行了很多年的暢通工程計劃后,終于修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。?
現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。 Input本題目包含多組數據,請處理到文件結束。?
每組數據第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。?
接下來是M行道路信息。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。?
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。Output對于每組數據,請在一行里輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.?
Sample Input 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2Sample Output 2 -1
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <set> #define INF 9999999 #define maxn 1100 int lowcost[maxn]; int mapp[maxn][maxn]; int vis[maxn]; int n,m; using namespace std; void dkstl(int a) {//memset(vis,0,sizeof(vis));int k,sum=0;for(int i=0;i<n;++i){lowcost[i]=mapp[a][i];vis[i]=0;}vis[a]=1;for(int j=0;j<n;++j){int minx=INF;for(int ?i=0;i<n;++i ){if(lowcost[i]<minx&&!vis[i]){minx=lowcost[i];k=i;}}vis[k]=1;if(minx==INF)break;for(int i=0;i<n;++i){if(!vis[i]&&(lowcost[k]+mapp[k][i])<lowcost[i]){lowcost[i]=lowcost[k]+mapp[k][i];}}} } int main() {int a,b,c,x;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;++i)for(int j=0;j<n;++j){if(i==j)mapp[i][j]=0;elsemapp[i][j]=INF;}for(int i=0;i<m;++i){scanf("%d%d%d",&a,&b,&c);if(mapp[a][b]>c)//開始gg在這兒了,當有重邊的時候要取權值的最小值mapp[a][b]=mapp[b][a]=c;}scanf("%d%d",&a,&b);dkstl(a);if(lowcost[b]==INF)cout<<-1<<endl;elsecout<<lowcost[b]<<endl;}return 0; }
現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。 Input本題目包含多組數據,請處理到文件結束。?
每組數據第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。?
接下來是M行道路信息。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。?
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。Output對于每組數據,請在一行里輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.?
Sample Input 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2Sample Output 2 -1
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <set> #define INF 9999999 #define maxn 1100 int lowcost[maxn]; int mapp[maxn][maxn]; int vis[maxn]; int n,m; using namespace std; void dkstl(int a) {//memset(vis,0,sizeof(vis));int k,sum=0;for(int i=0;i<n;++i){lowcost[i]=mapp[a][i];vis[i]=0;}vis[a]=1;for(int j=0;j<n;++j){int minx=INF;for(int ?i=0;i<n;++i ){if(lowcost[i]<minx&&!vis[i]){minx=lowcost[i];k=i;}}vis[k]=1;if(minx==INF)break;for(int i=0;i<n;++i){if(!vis[i]&&(lowcost[k]+mapp[k][i])<lowcost[i]){lowcost[i]=lowcost[k]+mapp[k][i];}}} } int main() {int a,b,c,x;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;++i)for(int j=0;j<n;++j){if(i==j)mapp[i][j]=0;elsemapp[i][j]=INF;}for(int i=0;i<m;++i){scanf("%d%d%d",&a,&b,&c);if(mapp[a][b]>c)//開始gg在這兒了,當有重邊的時候要取權值的最小值mapp[a][b]=mapp[b][a]=c;}scanf("%d%d",&a,&b);dkstl(a);if(lowcost[b]==INF)cout<<-1<<endl;elsecout<<lowcost[b]<<endl;}return 0; }
floyd
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <set> #define INF 9999999 #define maxn 1100 int lowcost[maxn]; int mapp[maxn][maxn]; int vis[maxn]; int n,m; using namespace std; int floyd(int a,int b) {for(int k=0;k<n;++k)for(int i=0;i<n;++i)for(int j=0;j<n;++j){if(mapp[i][j]>mapp[i][k]+mapp[k][j])mapp[i][j]=mapp[i][k]+mapp[k][j];}return mapp[a][b]; } int main() {int a,b,c,x;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;++i)for(int j=0;j<n;++j){if(i==j)mapp[i][j]=0;elsemapp[i][j]=INF;}for(int i=0;i<m;++i){scanf("%d%d%d",&a,&b,&c);if(mapp[a][b]>c)//開始gg在這兒了,當有重邊的時候要取權值的最小值mapp[a][b]=mapp[b][a]=c;}scanf("%d%d",&a,&b);int x=floyd(a,b);if(x==INF)cout<<-1<<endl;elsecout<<x<<endl;}return 0; } gg /*#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <set> #define INF 9999999 #define maxn 1100 int lowcost[maxn]; int mapp[maxn][maxn]; int vis[maxn]; int n,m; using namespace std; int dkstl(int a,int b) {int k,sum=0;for(int i=0;i<n;++i){lowcost[i]=mapp[a][i];vis[i]=0;}vis[a]=1;for(int j=1;j<n;++j){int minx=INF;for(int i=0;i<n;++i ){if(lowcost[i]<minx&&!vis[i]){minx=lowcost[i];k=i;}}if(minx==INF)break;sum+=minx;vis[k]=1;if(k==b){return sum;}for(int i=0;i<n;++i){if(!vis[i]&&lowcost[i]>mapp[k][i])lowcost[i]=mapp[k][i];}}return INF; } int main() {int a,b,c,x;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;++i)for(int j=0;j<n;++j){if(i==j)mapp[i][j]=0;elsemapp[i][j]=INF;}for(int i=0;i<m;++i){scanf("%d%d%d",&a,&b,&c);if(mapp[a][b]>c)//開始gg在這兒了,當有重邊的時候要取權值的最小值mapp[a][b]=mapp[b][a]=c;}scanf("%d%d",&a,&b);int x=dkstl(a,b);if(x==INF)cout<<-1<<endl;elsecout<<x<<endl;}return 0; } */SPFA:
#include <iostream> #include <cstring> #define maxn 1000 #define INF 999999 using namespace std; int map[maxn][maxn]; int p[maxn][maxn]; int vis[maxn]; int dist[maxn]; int n,m; int SPFA(int start) {int head=0,tail=1; int q[maxn*2];memset(q,0,sizeof(q));for(int i=0;i<=n;i++)dist[i]=INF;dist[start]=0; vis[start]=1; q[1]=start;//q[1]while(head<tail){head++;int t=q[head];vis[t]=0;for(int i=1;i<=p[t][0];++i){if(dist[p[t][i]]>dist[t]+map[t][p[t][i]]){dist[p[t][i]]=dist[t]+map[t][p[t][i]];//dist[p[t][i]]是直接到p[t][i]點的距離,dist[t]是直接到t的距離,map[t][p[t][i]]是經t到p[t][i]的距離 if(!vis[p[t][i]]){q[++tail]=p[t][i];vis[p[t][i]]=1; }}} } } int main() {int z,x,y;while(cin>>n>>m){memset(dist,0,sizeof(dist));memset(map,0,sizeof(map));memset(p,0,sizeof(p));memset(vis,0,sizeof(vis));for(int i=0;i<m;++i){cin>>x>>y>>z;if(map[x][y]!=0&&map[x][y]<z)continue;p[x][0]++,p[x][p[x][0]]=y,map[x][y]=z;p[y][0]++,p[y][p[y][0]]=x,map[y][x]=z;}int start,end;cin>>start>>end;SPFA(start);if(dist[end]!=INF)cout<<dist[end]<<endl;elsecout<<"-1"<<endl;}return 0; }SPFA&SPFA+dfs優化
#include <iostream> #include <cstring> #define maxn 1000 #define INF 999999 using namespace std; int map[maxn][maxn]; int p[maxn][maxn]; int vis[maxn]; int dist[maxn]; int n,m; /*int SPFA(int start) {int head=0,tail=1; int q[maxn*2];memset(q,0,sizeof(q));for(int i=0;i<=n;i++)dist[i]=INF;dist[start]=0; vis[start]=1; q[1]=start;//q[1]while(head<tail){head++;int t=q[head];vis[t]=0;for(int i=1;i<=p[t][0];++i){if(dist[p[t][i]]>dist[t]+map[t][p[t][i]]){dist[p[t][i]]=dist[t]+map[t][p[t][i]];//dist[p[t][i]]是直接到p[t][i]點的距離,dist[t]是直接到t的距離,map[t][p[t][i]]是經t到p[t][i]的距離 if(!vis[p[t][i]]){q[++tail]=p[t][i];vis[p[t][i]]=1; }}} } }*/ int SPFA(int start) {for(int i=1;i<=p[start][0];++i){if(dist[p[start][i]]>dist[start]+map[start][p[start][i]]){dist[p[start][i]]=dist[start]+map[start][p[start][i]];//start是經過的SPFA(p[start][i]);}} } int main() {int z,x,y;while(cin>>n>>m){// memset(dist,0,sizeof(dist));memset(map,0,sizeof(map));memset(p,0,sizeof(p));// memset(vis,0,sizeof(vis));for(int i=0;i<m;++i){cin>>x>>y>>z;if(map[x][y]!=0&&map[x][y]<z)continue;p[x][0]++,p[x][p[x][0]]=y,map[x][y]=z;p[y][0]++,p[y][p[y][0]]=x,map[y][x]=z;}int start,end;cin>>start>>end;for(int i=0;i<=n;++i){dist[i]=INF;}dist[start]=0;SPFA(start);if(dist[end]!=INF)cout<<dist[end]<<endl;elsecout<<"-1"<<endl;}return 0; }總結
以上是生活随笔為你收集整理的hdu1874 畅通工程续的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: manacher马拉车算法
- 下一篇: 最短路径·三:SPFA算法 HihoCo