HDU 2066 一个人的旅行
spfa
#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MAXN=1005; const int MAXM=2000005; const int inf=0x3f3f3f3f; inline int read(){ int x=0,f=1,ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int nxt[MAXM],cost[MAXM],to[MAXM],h[MAXN],cnt; inline void add(int x,int y,int w){ nxt[cnt]=h[x];cost[cnt]=w;to[cnt]=y;h[x]=cnt++; nxt[cnt]=h[y];cost[cnt]=w;to[cnt]=x;h[y]=cnt++; } int dis[MAXN],vis[MAXN]; queue<int> q; inline void spfa(int x){ memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); while(!q.empty()) q.pop(); q.push(x);dis[x]=0;vis[x]=1; while(!q.empty()){ int e=q.front();q.pop();vis[e]=0; for(int i=h[e];i!=-1;i=nxt[i]) if(dis[to[i]]>dis[e]+cost[i]){ dis[to[i]]=dis[e]+cost[i]; if(!vis[to[i]]) vis[to[i]]=1,q.push(to[i]); } } } int t,s,d; int main(){ while(scanf("%d %d %d",&t,&s,&d)!=EOF){ memset(h,-1,sizeof(h));cnt=0; for(int i=1;i<=t;i++){ int x=read(),y=read(),w=read(); add(x,y,w); } for(int i=1;i<=s;i++){ int x=read();add(0,x,0); } spfa(0); int ans=inf; for(int i=1;i<=d;i++){ int x=read(); ans=min(ans,dis[x]); } // for(int i=1;i<=10;i++) cout<<i<<"\t"<<dis[i]<<endl; printf("%d\n",ans); } return 0; }
dijkstra
#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MAXN=1005; const int MAXM=2000005; const int inf=0x3f3f3f3f; inline int read(){ int x=0,f=1,ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int to[MAXM],nxt[MAXM],cost[MAXM],h[MAXN],cnt; inline void add(int x,int y,int w){ nxt[cnt]=h[x];to[cnt]=y;cost[cnt]=w;h[x]=cnt++; nxt[cnt]=h[y];to[cnt]=x;cost[cnt]=w;h[y]=cnt++; } struct stu{ int dis,id; bool operator < (const stu b)const{ return dis>b.dis; } }; priority_queue<stu> q; int dis[MAXN]; inline void dijkstra(int x){ memset(dis,0x3f,sizeof(dis)); while(!q.empty()) q.pop(); dis[x]=0;q.push((stu){dis[x],x}); while(!q.empty()){ stu e=q.top();q.pop(); for(int i=h[e.id];i!=-1;i=nxt[i]) if(dis[to[i]]>dis[e.id]+cost[i]) dis[to[i]]=dis[e.id]+cost[i],q.push((stu){dis[to[i]],to[i]}); } } int t,s,d; int main(){ while(scanf("%d %d %d",&t,&s,&d)!=EOF){ memset(h,-1,sizeof(h));cnt=0; for(int i=1;i<=t;i++){ int x=read(),y=read(),w=read(); add(x,y,w); } for(int i=1;i<=s;i++){ int x=read(); add(0,x,0); } dijkstra(0); int ans=inf; for(int i=1;i<=d;i++){ int x=read(); ans=min(ans,dis[x]); } printf("%d\n",ans); } return 0; }