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;
}