HDU2680 Choose the best route 单源最短路径

单源最短路径。

和HDU2066差不多,题目大意就是给你一个有向图(刚开始一直当无向图做的,WA哭了)和若干起始点,求出到终点的最短路径。

暴力是行得通的,但要注意怎么暴力,直接做的话会TLE(其实我也想不明显,2066明明就可以,为毛到这就行不通了),但由于是有向图,我们可以把图反过来看,把若干起始点当成若干终点,这样Dijkstra()函数就只执行一遍,比直接做要快出很多的。只需在输入的时候把路径也反过来纪录就行了。

#include <cstdio>
#include <iostream>
#define MAX 1010
#define INF 999999999
using namespace std; bool s[MAX]; int ans[MAX][MAX],dist[MAX]; void Dijkstra(int n,int v) { int i,j,u,temp; for(i=1;i<=n;i++) {
        dist[i]=ans[v][i];
        s[i]=false; }
    dist[v]=0;
    s[v]=true; for(i=1;i<=n;i++) {
        temp=INF;
        u=v; for(j=1;j<=n;j++) if(!s[j]&&dist[j]<temp) {
              u=j;
              temp=dist[j]; }
        s[u]=true; for(j=1;j<=n;j++) if(!s[j]&&dist[j]>dist[u]+ans[u][j])
            dist[j]=dist[u]+ans[u][j]; } } int main() { int t,w,e,n,n_min; int a,b,x,i,j,S[MAX]; while(scanf("%d%d%d",&t,&w,&e)!=-1) {
        n_min=INF; for(i=0;i<=t;i++) for(j=0;j<=t;j++)
            ans[i][j]=INF; for(i=0;i<w;i++) {
            scanf("%d%d%d",&a,&b,&x); if(ans[b][a]>x)
              ans[b][a]=x; }
        scanf("%d",&n); for(i=0;i<n;i++)
          scanf("%d",&S[i]);
        Dijkstra(t,e); for(i=0;i<n;i++) { if(n_min>dist[S[i]])
              n_min=dist[S[i]]; } if(n_min==INF)  puts("-1"); else printf("%d\n",n_min); } return 0; }

你可能感兴趣的:(HDU2680 Choose the best route 单源最短路径)