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

  

posted @ 2018-09-30 08:51  古城独钓  阅读(96)  评论(0编辑  收藏  举报