最短路水題
阿新 • • 發佈:2018-12-08
1、HDU2544
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int n,m; int v[1005],d[1005],w[1005][1005]; void dijkstra(int x){ memset(v,0,sizeof(v)); for(int i=1; i<=n; i++) d[i]=INF; d[1]=0; for(int i=0; i<n; i++){ int x,maxx=INF; for(int y=1; y<=n; y++) if(!v[y]&&d[y]<=maxx){ maxx=d[y]; x=y; } v[x]=1; for(int y=1; y<=2*n; y++) d[y]=min(d[y],d[x]+w[x][y]); } } int main(){ while(cin>>n>>m&&n+m){ int x,y; memset(w,INF,sizeof(w)); for(int i=0; i<m; i++){ cin>>x>>y; cin>>w[x][y]; w[y][x]=w[x][y]; } dijkstra(1); printf("%d\n",d[n]); } return 0; }
HDU2066
看似可以有許多起點和終點,但我們可以只用一次dijkstra算出來,將草兒家視為0,相鄰的城市距離mapp[0][i]=0;然後從所有終點選出來最小的就可以了。
#include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int v[1005],d[1005],w[1005][1005],xc,xd[1005],cs; int t,s,n,a,b,ti; void dijkstra(){ memset(v,0,sizeof(v)); memset(d,INF,sizeof d); d[0]=0; for(int i=0;i<=cs;i++){ int x,maxx=INF; for(int j=0;j<=cs;j++){ if(!v[j]&&d[j]<=maxx){ maxx=d[j]; x=j; } } v[x]=1; for(int y=0; y<=cs; y++) d[y]=min(d[y],d[x]+w[x][y]); } } int main(){ while(cin>>t>>s>>n){//有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有n個 memset(w,INF,sizeof w); cs=0; for(int i=1;i<=t;i++){ cin>>a>>b>>ti;//表示a,b城市之間的車程是ti小時 cs=max(cs,max(a,b)); if(w[a][b]>ti) w[a][b]=w[b][a]=ti; } for(int i=1;i<=s;i++){ cin>>xc; w[0][xc]=0; } for(int i=1;i<=n;i++){ cin>>xd[i]; } dijkstra(); int minn=INF; for(int i=1;i<=n;i++){ minn=min(minn,d[xd[i]]); } cout<<minn<<endl; } return 0; }
luoguP1339
#include<bits/stdc++.h> #define ll long long #define INF 0x3f3f3f3f #define qx std::ios::sync_with_stdio(false) #define N 2100 using namespace std; int t,c,s,e,a,b,z;//城鎮、道路、起始的城鎮、終點的城鎮 int d[2510],v[2510],w[2510][2510]; void dijk(int x){ memset(d,INF,sizeof d); d[x]=0; for(int i=1;i<=t;i++){ int x,maxx=INF; for(int i=1;i<=t;i++){ if(!v[i]&&maxx>d[i]){ x=i; maxx=d[i]; } } v[x]=1; for(int i=1;i<=t;i++){ d[i]=min(d[i],d[x]+w[x][i]); } } } int main(){ cin>>t>>c>>s>>e; memset(w,INF,sizeof w); for(int i=0;i<c;i++){ cin>>a>>b>>z; if(c<w[a][b]){ w[a][b]=z; w[b][a]=z; } } dijk(s); cout<<d[e]<<endl; return 0; }