最短路水题

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

猜你喜欢

转载自blog.csdn.net/Endeavor_G/article/details/84636318