先生的信与路由
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;
}