poj2502 Subway最短路

来源:互联网 发布:蜂群算法 pid 编辑:程序博客网 时间:2024/04/29 11:42
先是spfa的做法,参考了别人的代码,建图能力牛啊,建图还是比较麻烦的,dijkstra更好理解点,所以自己本来写的 dijkstra就放在了下面,
#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#define ll long long#define LL __int64const ll INF=9999999999999;using namespace std;#define M 400000100#define inf 0xfffffff//vector<int,int> G[20002];//vector<pair<int,int>> ::iterator iter;//map<ll,int>mp;//map<ll,int>::iterator p;int head[2002],cnt,n;double dis[2002];bool vis[2002];struct edge{int from,to,nex;double d;}e[100000];struct Node{double x,y;}node[2002];void clear(){memset(node,0,sizeof(node));memset(e,0,sizeof(e));memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));cnt=0;}double Dis(Node x,Node y){return sqrt((double)((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)));}void add(int u,int v,double d){edge E={u,v,head[u],Dis(node[u],node[v])*6/(d*100)};e[cnt]=E;head[u]=cnt++;}void spfa(){queue<int> q;while(!q.empty())q.pop();for(int i=0;i<=n;i++)dis[i]=inf;dis[1]=0;vis[1]=1;q.push(1);while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=e[i].nex){int v=e[i].to;if(dis[u]+e[i].d<dis[v]){dis[v]=dis[u]+e[i].d;if(!vis[v]){vis[v]=1;q.push(v);}}}}}int main(void){clear();scanf("%lf %lf %lf %lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y);double x,y;int mark=3;n=3;while(~scanf("%lf %lf",&x,&y))if(x==-1 && y==-1){for(int i=mark;i<n-1;i++){add(i,i+1,40.0);add(i+1,i,40.0);}mark=n;}else{node[n].x=x;node[n++].y=y;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j)add(i,j,10);spfa();printf("%.0lf\n",dis[2]);}

dijkstra只要建好图 就是模版题目了,

#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#define ll long long#define LL __int64const ll INF=9999999999999;using namespace std;#define M 400000100#define inf 0xfffffff//vector<int,int> G[20002];//vector<pair<int,int>> ::iterator iter;//map<ll,int>mp;//map<ll,int>::iterator p;bool vis[2102];double dis[2102];double mp[2102][2102];int mark;struct Node{double x,y;}node[2102];void clear(){memset(dis,0.0,sizeof(dis));memset(vis,0,sizeof(vis));memset(mp,0.0,sizeof(mp));memset(node,0,sizeof(node));}double Dis(Node x,Node y){return sqrt((double)((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)));}void dijkstra(){int u;for(int i=0;i<mark;i++)dis[i]=mp[0][i];vis[0]=1;for(int i=1;i<mark;i++){double maxn=inf*1.0;for(int j=0;j<mark;j++){if(!vis[j] && dis[j]<maxn){maxn=dis[j];u=j;}}vis[u]=1;for(int j=0;j<mark;j++)if(!vis[j]){maxn=dis[u]+mp[u][j];if(maxn<dis[j])dis[j]=maxn;}}}int main(void){clear();scanf("%lf %lf %lf %lf",&node[0].x,&node[0].y,&node[1].x,&node[1].y);mark=2;int x,y;bool flag=false;while(~scanf("%lf %lf",&node[mark].x,&node[mark].y)){if(node[mark].x==-1 && node[mark].y==-1){flag=false;continue;}if(flag){double d=Dis(node[mark],node[mark-1])/40000.0;mp[mark][mark-1]=mp[mark-1][mark]=d;}flag=true;mark++;}for(int i=0;i<mark;i++)for(int j=0;j<mark;j++)if(i!=j && mp[i][j]==0.0)mp[i][j]=mp[j][i]=Dis(node[i],node[j])/10000.0;dijkstra();double ans=dis[1]*60.0;printf("%.0lf\n",ans);}