没地方存代码系列————一堆最短路

http://59.77.139.92/Problem.jsp?pid=1499

FJUTOJ 1499 直接建图求s到T的最短路就可以了。

Floyd

#include <bits/stdc++.h>

using namespace std;
const int maxn = 205;

int n,m,mp[maxn][maxn];
/**

dp[k][i][j]  1~k i->j的最短路
dp[k][i][j]=min(dp[k-1][i][j],dp[k-1][i][k]+dp[k-1][k][j])

    i->k->j
    i->j 与 i->k,k->j 的最短路
    只与k,k-1省略一维度空间后
    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
*/
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                if(i==j)mp[i][j]=0;
                else mp[i][j]=1e9;
        for(int i=0; i<m; i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            mp[x][y]=min(z,mp[x][y]);
            mp[y][x]=min(z,mp[y][x]);
        }
        int s,t;
        scanf("%d%d",&s,&t);
        for(int k=0; k<n; k++)
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);

        if(mp[s][t]==1e9)puts("-1");
        else printf("%d\n",mp[s][t]);

    }
    return 0;
}

SPFA+邻接表

#include <bits/stdc++.h>

using namespace std;
const int maxn = 205;
vector<pair<int,int> >E[maxn];

int n,m;
int d[maxn],inq[maxn];
void init()
{
    for(int i=0; i<maxn; i++)E[i].clear();
    for(int i=0; i<maxn; i++)inq[i]=0;
    for(int i=0; i<maxn; i++)d[i]=1e9;
}

int main()
{
    while(cin>>n>>m)
    {
        init();
        for(int i=0; i<m; i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            E[x].push_back(make_pair(y,z));
            E[y].push_back(make_pair(x,z));
        }
        int s,t;
        scanf("%d%d",&s,&t);

        queue<int>Q;
        Q.push(s),d[s]=0,inq[s]=1;
        while(!Q.empty())
        {
            int now=Q.front();
            Q.pop();
            inq[now]=0;
            for(int i=0; i<E[now].size(); i++)
            {
                int v=E[now][i].first;
                if(d[v]>d[now]+E[now][i].second)
                {
                    d[v]=d[now]+E[now][i].second;
                    if(inq[v]==1)continue;
                    inq[v]=1;
                    Q.push(v);
                }
            }
        }
        if(d[t]==1e9)printf("-1\n");
        else printf("%d\n",d[t]);
    }
    return 0;
}

  

  

FJUT OJ 1443 http://59.77.139.92/Problem.jsp?pid=1443

直接建图,求1-n的最短路,dijkstra一堆for的版本

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define  INF 1<<29

using namespace std;
int mp[1005][1005],i,j,t,n,a,b,c;

void dijkstra()
{
    int minn,v,dis[1005],vis[1005]={0};
    for(i=1;i<=n;i++)
        dis[i]=mp[1][i];

    for(i=1;i<=n;i++)
    {
        minn=INF;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]<minn)
            {
                v=j;
                minn=dis[j];
            }
        }
        vis[v]=1;

        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]>mp[v][j]+dis[v])
            {
                dis[j]=mp[v][j]+dis[v];
            }
        }
    }
    printf("%d\n",dis[n]);
}

int main()
{
    while(~scanf("%d%d",&t,&n))
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(i==j)
                {
                    mp[i][j]=0;
                }
                else
                {
                    mp[i][j]=mp[j][i]=INF;
                }
            }
        }
        for(i=0;i<t;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(mp[a][b]>c)mp[a][b]=mp[b][a]=c;
        }
        dijkstra();
    }

    return 0;
}

  

  

FJUTOJ 1456 http://59.77.139.92/Problem.jsp?pid=1456

转向次数可以看作路径长度,建图求最短路,这里用的是链式前向星+dijkstra

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define  INF 0x3fffffff

using namespace std;
const int maxn =10010;

int first[maxn],sign;

struct node
{
    int to,w,next;
}edge[maxn*2];

void creat()
{
    for(int i=0;i<maxn;i++)
        first[i]=0;
    sign=1;
}

void add_edge(int u,int v,int w)///u->v cost w
{
    edge[sign].w=w;
    edge[sign].to=v;
    edge[sign].next=first[u];
    first[u]=sign++;
}

int dij(int n,int a,int b)
{
    int dis[n+5],vis[n+5];
    int nn=n-1;
    for(int i=0;i<=n;i++)
    {
        dis[i]=INF,vis[i]=0;
    }
    dis[a]=0;
    int p=a;
    while(nn--)
    {
        vis[p]=1;
        for(int k=first[p];k;k=edge[k].next)
        {
            int to=edge[k].to;
            if(!vis[to]&&dis[to]>dis[p]+edge[k].w)
            {
                dis[to]=dis[p]+edge[k].w;
            }
        }
        int mincost=INF;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&dis[i]<mincost)
            {
                mincost=dis[i];
                p=i;
            }
        }
        if(mincost==INF)return -1;
    }
    return dis[b];
}

int main()
{
    int n,a,b,num,tmp;
    while(~scanf("%d%d%d",&n,&a,&b))
    {
        creat();
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&num,&tmp);
            add_edge(i,tmp,0);
            for(int j=1;j<num;j++)
            {
                scanf("%d",&tmp);
                add_edge(i,tmp,1);
            }
        }
        int ans=dij(n,a,b);
        printf("%d\n",ans);
    }
    return 0;
}

  

  

FJUTOJ 1501 http://59.77.139.92/Problem.jsp?pid=1501

邻接矩阵+spfa

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define  INF 1<<29
#define  MAXN 1005

using namespace std;
int n,m,s,mp[MAXN][MAXN];

int spfa(int s,int t)
{
    int dis[MAXN],inq[MAXN];
    for(int i=0;i<=n;i++)
    {
        dis[i]=INF,inq[i]=0;
    }
    queue<int>q;
    q.push(0);
    dis[0]=0,inq[0]=1;
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        inq[now]=0;
        for(int i=0;i<=n;i++)
        {
            if(dis[i]>dis[now]+mp[now][i])
            {
                dis[i]=dis[now]+mp[now][i];
                if(!inq[i])
                {
                    inq[i]=1;
                    q.push(i);
                }
            }
        }
    }
    if(dis[t]==INF) return -1;
    return dis[t];
}

int main()
{
    int u,v,w,num,tmp;
    while(~scanf("%d%d%d",&n,&m,&s))
    {
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                if(i==j)mp[i][j]=0;
                else mp[i][j]=INF;
            }
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            mp[u][v]=min(mp[u][v],w);
        }
        scanf("%d",&num);
        while(num--)
        {
            scanf("%d",&tmp);
            mp[0][tmp]=0;
        }
        printf("%d\n",spfa(0,s));
    }
    return 0;
}

  

时间: 2024-11-05 21:38:34

没地方存代码系列————一堆最短路的相关文章

老二牛车Axure夜话: Axure嵌入代码系列视频教程汇总贴

老二牛车Axure夜话: Axure嵌入代码系列视频教程汇总贴 Axure嵌入代码系列视频教程汇总贴 嵌入代码系列视频教程之QQ一键加群 嵌入代码系列视频教程之新浪微博秀 嵌入代码系列视频教程之腾讯微博秀 嵌入代码系列视频教程之嵌入百度分享 嵌入代码系列视频教程之嵌入视频 嵌入代码系列视频教程之嵌入百度地图

iOS开发一行代码系列:一行搞定输入框

最近总结了下开发过程中常用的功能,发现有时候我在做重复性的劳动.于是决定把常用的功能抽出来,方便下次使用. 我的想法是:用最少的代码来解决问题.于是写了一些常用的工具类,名字就叫一行代码系列吧...好像挺挫的.. 大致内容有: 1.一行搞定输入框 2.一行搞定网络请求 3.一行搞定上下拉刷新(会自动判断是上拉还是下拉还是两者并存) 4.一行搞定数据库(最近还在写,功能已经基本实现) 5.一行搞定图片保存 6.一行搞定定位 7.一行搞定网络状况变化 8.一行搞定X(功能小集合) 一行搞定输入框 输

当程序执行时间很快,控制台没显示执行代码和数据库

当程序执行时间很快,控制台没显示执行代码和数据库时,要想到是resin没找到程序的原因,这个时候就要检查配置文件里对应程序的路径是否正确. 如图:

洛谷P2832 行路难 分析+题解代码【玄学最短路】

洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座山,只能单向通过,并会耗费小X一定时间. 小X现在在1号山,他的目的是n号山,因为那里有火车站. 然而小X的体力是有限的.他每通过一条羊肠小道,就会变得更疲劳,导致他通过任意一条羊肠小道的时间都增加1. 输入格式: 第一行两个数,n,m 第2行到第m+1行,每行3个数A,B,C,表示A.B之间有一条

整洁代码系列(1)

1.首先我们必须要了解糟糕的代码会导致什么问题? 越糟糕的代码,别人理解的时间就越长,会导致进度严重滞后(代码不仅仅是写给自己看的,除了自己,团队的其他成员也需要在必要的时候去理解): 越糟糕的代码,每次添加或修改代码,如果再不改变糟糕行为的前提下,代码回越来越烂,再也无法理清,最后会束手无策: 随着混乱的增加,团队的生产力会持续的下降,最后趋向于零. 当生产力下降时,管理层只会做一件事,就是增加更多的人手到项目中,期望提升生产力,可是新人并不熟悉系统的设计,但却背负着提升生产力的可怕压力,于是

Object-C iOS纯代码布局 一堆代码可以放这里!

前言: 最近写的文章都是创业类,好吧,今天好好写写技术类的文章! 不过分享的不是IOS相关的文章,毕竟这几天在速成IOS,看的是objective-c,由于速成的很快,好累! 好在现在基本已经入了点门道了,这才看的懂新人的代码,才能提前感受代码危机. 对于IOS的速成口诀,回头再分享,今天先分享一个简单的抽象封装! 1:先看看问题 说明:通常对于界面布局,有编写代码.Xib.Storyboard三种方式,而我看到新人写的,是通过代码布局的. 看到的代码是这样的: A:编写UI的代码已分离到新的类

git 检查是否有commit到本地但还没push的代码

使用 git status 命令可以得到以下结果 $ git status On branch dev_getTicketCnt Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working directory clean 这就表示本地库还有没push的内容 如果是以下结果,就表示本地全部都pus

最近新装系统windows8.1+Mac。。。还没装驱动就遇到一堆问题。。。

---恢复内容开始--- 1,刚开始装好了,后来莫名看不到磁盘了,原因:64位mac盘会丢失盘符,所以macdrive也看不到...解决:(将AF改为06,修改内容后改回AF,早知道这么简单就不用重新分区全部重来了) 2,莫名MAC盘变成主分区,改fat32为AF后自动隐藏,苹果安装时找不到磁盘,也无法格式化无法安装...解决:(直接在windows下分好mac系统盘,不要格式化,再用diskgenius改为AF即可) 3,主分区MAC盘后无法回来...好像没什么好办法,网上找了一堆也没解决,最

u盘作为git仓库,完成不同地方的代码同步

参考网上一篇 "把Git Repository建到U盘上去" 1.我经常有这样的需求,工作.家里需要对同一份代码或文档编辑,并希望在不同地方能同步: 如果是私密性不那么强,可以直接使用github托管哈,当然付费也是可以私密的~~   2.首先U盘上创建一个repository   名称: git_mycbb_repos    git init –bare  git_mycbb_repos  //裸库,没有work目录   3.再建一个源项目  名称:git_mycbb    git