最短路 【卡io】

先生的信与路由
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 324 Solved: 89
[Submit][Status][Web Board]
Description
L先生辛辛苦苦写完了要寄给朋友Z的信。

信将在网络中传输,已知网络由n个路由器互连而成,路由器之间的链路费用由邻接矩阵表示,L先生的PC机和服务器分别接在路由器s和路由器e上,忽略PC机和服务器到直接相连的路由器的费用,请求出L先生的PC机到服务器的最小费用。(路由网络可以看成有向图)。

Input
多组测试例,处理到文件结束。(测试例总量<5)。

每个测试例由若干行组成。

第一行有三个数,分别是n、s和e,之间用空格隔开。
后续每行表示与每个路由器相连的路由器的编号和链路费用,用二元组(路由器编号 链路费用(不超过10000))表示,二元组之间用空格隔开,每行表示一个路由器,行号按照路由器编号升序排列。
Output
每组测试例占一行,输出L先生的PC机到服务器的最小费用。
Sample Input
6 1 6
(2 2) (4 1) (3 5)
(1 2) (3 3) (4 2)
(1 5) (2 3) (4 3) (5 2) (6 2)
(1 1) (2 2) (3 3) (5 1)
(4 1) (3 2) (6 2)
(3 2) (5 2)
Sample Output
4
HINT

这道题 就是考图的建立,然后就是考输入的问题。
一开始一直是用的 getchar();来输入,一直超时间,然后就各种优化仍然不行,直到有人说 读取数据的时候是从文件中读取的,因为用getchar的时候是以 ‘\n’为结束的标志,但是文件的最后是不会有‘\n’的,才意识到 那就只能用gets 或者 来特判下是不是 文件结尾 ch==EOF。

就是输入的时候如果是以回车来决定是不是 终止输入。。就是一定要特判是不是到 文件结尾,===》可以用字符来特判是不是到文件结尾,ch!=EOF 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue> 
#define MAXN 200+10
#define MAXM 1000000+10
using namespace std;
void read(int &x){
    x=0;char c;
    while((c=getchar())<'0');
    do x=x*10+c-'0';while((c=getchar())>='0');
}
struct Edge {
    int from,to,val,next;
}edge[MAXM];
int head[MAXN],top;
int vis[MAXN];
int dis[MAXN];
int n,st,ed;
void addedge(int a,int b,int c)
{
    Edge e={a,b,c,head[a]};
    edge[top]=e;head[a]=top++;
}
void init()
{
    memset(head,-1,sizeof(head));
    top=0;
}
void getmap()
{
    getchar();char s[1000];
    for(int i=1;i<=n;i++)
    {
        gets(s);
        for(int j=0;s[j]!='\0';j++)
        {
            if(s[j]>='0'&&s[j]<='9') 
            {
                int b=0;
                for(int k=j;s[j]>='0'&&s[j]<='9';j++,k++) 
                {
                    b=b*10+s[k]-'0';
                }
                int c=0;
                j++;
                for(j;s[j]>='0'&&s[j]<='9';j++)
                {
                    c=c*10+s[j]-'0';
                }
                addedge(i,b,c);
            }
        }
    }
}
void spfa()
{
    queue<int>Q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    vis[st]=1;dis[st]=0;
    Q.push(st);
    while(!Q.empty())
    {
        int now=Q.front();Q.pop();
        vis[now]=0;
        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int nexts=edge[i].to;
            if(dis[nexts]>dis[now]+edge[i].val)
            {
                dis[nexts]=dis[now]+edge[i].val;
                if(!vis[nexts])
                {
                    vis[nexts]=1;
                    Q.push(nexts);
                }
            }
        }
    }
    printf("%d\n",dis[ed]);
}
int main()
{

    while(~scanf("%d%d%d",&n,&st,&ed))
    {
        init();
        getmap();
        spfa();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值