HDU2680 Choose the best route
题目大意:一个笨蛋要坐车去朋友家,但坐车呕吐,所以想在最短时间内到达。
测试数据意思:
第一行三个数:n(车站的个数,n<1000) | m(代表车站之间所有线路的总个数) | s(代表离朋友家最近的车站)
下面有m行: p q t 意思是:一条从p到q的线路,花费t时间
m行之后有个数字:w (代表可以在开始时搭乘的车站)
下面w个数W1,W2....Ww就是车站的编号
dijkstra:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <cmath> #include <vector> #include <algorithm> using namespace std; #define inf 1e8 struct node { int x,d; node(){} node(int a,int b){x=a;d=b;} bool operator < (const node &a) const { if(d==a.d) return x<a.x; else return d>a.d; } }; vector<node>eg[1005]; int n,m,k,w,dis[1005],a,b,t; void dijkstra(int x) { for(int i=1;i<=n;i++) dis[i]=inf; dis[x]=0; priority_queue<node>q; q.push(node(x,0)); while(!q.empty()) { node x=q.top(); q.pop(); for(int i=0;i<eg[x.x].size();i++) { node y=eg[x.x][i]; if(dis[y.x]>x.d+y.d) { dis[y.x]=x.d+y.d; q.push(node(y.x,dis[y.x])); } } } } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&n,&m,&k)) { for(int i=1;i<=n;i++) eg[i].clear(); while(m--) { scanf("%d%d%d",&a,&b,&t); eg[b].push_back(node(a,t)); } dijkstra(k); scanf("%d",&w); int ans=inf; while(w--) { scanf("%d",&a); if(dis[a]<ans) ans=dis[a]; } if(ans<inf) printf("%d\n",ans); else printf("-1\n"); } return 0; }
spfa:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <cmath> #include <vector> #include <algorithm> using namespace std; #define inf 1e8 struct node { int x,s; node(int a,int b){x=a;s=b;} }; vector<node>eg[1005]; int n,m,k,a,b,s,dis[1005]; bool vis[1005]; void spfa(int x) { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=inf; dis[x]=0; vis[x]=true; queue<int>q; q.push(x); while(!q.empty()) { int y=q.front(); q.pop(); vis[y]=false; for(int i=0;i<eg[y].size();i++) { int p=eg[y][i].x,s=eg[y][i].s; if(dis[p]>dis[y]+s) { dis[p]=dis[y]+s; if(vis[p]==false) { vis[p]=true; q.push(p); } } } } } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&n,&m,&k)) { for(int i=1;i<=n;i++) eg[i].clear(); while(m--) { scanf("%d%d%d",&a,&b,&s); eg[b].push_back(node(a,s)); } spfa(k); int ans=inf; scanf("%d",&m); while(m--) { scanf("%d",&a); if(ans>dis[a]) ans=dis[a]; } if(ans<inf) printf("%d\n",ans); else printf("-1\n"); } return 0; }