最短路径?青蛙(Frogger), ZOJ1942, POJ2253

来源:互联网 发布:关于网络暴力的演讲稿 编辑:程序博客网 时间:2024/06/06 08:59

感觉只是用了最短路径的思想啊。

bellman算法是神奇的迭代,dijkstra是神奇的贪心。

看了下面这个图,感到这特么就是个最小生成树的计算过程啊。


//本题求的是从起点到终点的所有通路中的最大的边的最小值(起点是第一个,终点是第二个坐标),感觉和最短路没有太大的关系,就是过程有点类似  //请尽量选择c++编译器,g++神奇的wa #include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<queue>#include<limits.h> using namespace std;const int mn=201,mm=40005;struct Edge{int to,w,next;}edges[mm];int head[mn],n,tot,x[mn],y[mn];inline int dist(int i,int j){return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);}void add(int u,int v){//建双向边 edges[tot].to=v;edges[tot].w=dist(u,v);edges[tot].next=head[u];head[u]=tot++;edges[tot].to=u;edges[tot].w=dist(u,v);edges[tot].next=head[v];head[v]=tot++;}double spfa(){queue<int> q;int vis[mn]={1},dis[mn];//vis判断是否在队列中 for(int i=0;i<n;++i)dis[i]=INT_MAX;q.push(0);dis[0]=0;while(q.size()){int x=q.front();q.pop();vis[x]=0;for(int j=head[x];~j;j=edges[j].next){int v=edges[j].to;if(dis[v]>max(dis[x],edges[j].w)){dis[v]=max(dis[x],edges[j].w);if(!vis[v]){vis[v]=1;q.push(v); }}}}return sqrt(1.0*dis[1]);}int main(){int kase=1;while(scanf("%d",&n)&&n){memset(head,-1,sizeof(head));tot=0;for(int i=0;i<n;++i)scanf("%d%d",x+i,y+i);for(int i=0;i<n;++i)for(int j=i+1;j<n;++j)add(i,j);printf("Scenario #%d\n",kase++);printf("Frog Distance = %.3lf\n\n",spfa());//两个回车 }return 0;}


//本题数据比较水,来个dfs,如果该点可以迭代,则以该点继续迭代下去,这个结论是对的,值得思考 #include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<queue>#include<limits.h>using namespace std;const int mn=205,mm=40005;struct Edge{    int to,w,next;} edges[mm];int head[mn],n,tot,x[mn],y[mn];inline int dist(int i,int j){    return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);}void add(int u,int v){    //建双向边    edges[tot].to=v;    edges[tot].w=dist(u,v);    edges[tot].next=head[u];    head[u]=tot++;    edges[tot].to=u;    edges[tot].w=dist(u,v);    edges[tot].next=head[v];    head[v]=tot++;}int d[mn],vis[mn];void dfs(int i){    for(int j=head[i]; ~j; j=edges[j].next)    {        int v=edges[j].to;        if(d[v]>max(d[i],edges[j].w))        {        d[v]=max(d[i],edges[j].w);        vis[v]=1;dfs(v);vis[v]=0;}    }}int main(){    int kase=1;    while(scanf("%d",&n)&&n)    {        memset(head,-1,sizeof(head));        tot=0;        for(int i=0; i<n; ++i)            scanf("%d%d",x+i,y+i);        for(int i=0; i<n; ++i)            for(int j=i+1; j<n; ++j)                add(i,j);        memset(d,6,sizeof(d));        memset(vis,0,sizeof(vis));        d[0]=0;        vis[0]=1;        dfs(0);        printf("Scenario #%d\n",kase++);        printf("Frog Distance = %.3lf\n\n",sqrt(1.0*d[1]));//两个回车    }    return 0;}

原创粉丝点击