hdu 4396(spfs/二维最短路)

来源:互联网 发布:基本款斜挎包 知乎 编辑:程序博客网 时间:2024/06/04 18:07

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4396

思路:dist[i][j]表示到顶点i走了k条路所花费的最小时间,为了节省内存,当j>=k时,直接令j=k即可,然后就是二维spfa求最短路了。

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 #define MAXN 5555 9 #define inf 1<<3010 struct Node{11    int v,w;12 };13 vector<Node>map[MAXN];14 typedef pair<int,int>Pair;15 16 int dist[MAXN][55];//表示到i点经过j条路的最小花费17 bool mark[MAXN][55];18 int n,m,st,ed,k;19 20 void spfa(){21    for(int i=0;i<=n;i++)22       for(int j=0;j<55;j++)23          dist[i][j]=inf;24    memset(mark,false,sizeof(mark));25    mark[st][0]=true;26    dist[st][0]=0;27    queue<Pair>Q;28    Q.push(make_pair(st,0));29    while(!Q.empty()){30       Pair pp=Q.front();31       Q.pop();32       int u=pp.first;33       int step=pp.second;34       mark[u][step]=false;35       for(int i=0;i<map[u].size();i++){36          int v=map[u][i].v;37          int w=map[u][i].w;38          int nstep=step+1;39          if(nstep>k)nstep=k;40          if(dist[v][nstep]>dist[u][step]+w){41             dist[v][nstep]=dist[u][step]+w;42             if(!mark[v][nstep]){ mark[v][nstep]=true;Q.push(make_pair(v,nstep)); }43          }44       }45    }46 }47 48 int main(){49    int u,v,w;50    while(~scanf("%d%d",&n,&m)){51       for(int i=0;i<=n;i++)map[i].clear();52       for(int i=1;i<=m;i++){53          scanf("%d%d%d",&u,&v,&w);54          Node p1,p2;55          p1.v=v,p1.w=w;56          p2.v=u,p2.w=w;57          map[u].push_back(p1);58          map[v].push_back(p2);59       }60       scanf("%d%d%d",&st,&ed,&k);61       k=k/10+(k%10!=0);62       spfa();63       if(dist[ed][k]!=inf){64          printf("%d\n",dist[ed][k]);65       }else66          puts("-1");67    }68    return 0;69 }
View Code

 

0 0