您的位置:首页 > 其它

nyoj1238 最少换乘 最短路

2015-10-24 16:44 465 查看
先上链接http://acm.nyist.net/JudgeOnline/problem.php?pid=1238

基本没难点,最基础的迪杰斯特拉。输入用字符串处理gets()和getline()都可以。记得用getchar()吃掉回车。但是我居然写了四天,残念~~最后被狗哥一句话点醒,输入有多位数啊,魂淡!!!不提了,我先静静。上代码

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<stack>
#include<queue>
#include<fstream>
#include<algorithm> j
#include<map>
#include<set>
#include<vector>
#include<functional>
#include<cmath>

using namespace std;
const double PI=acos(-1.0);
#define INF 0x3f3f3f3f
#define NINF 0xbfffffff
int m,n,t;
char str[2000];
int lim[510];
int map1[505][505];
int g;
void cleaner()
{
for(int j=1; j<=n; j++)
for(int i=1; i<=n; i++)
{
if(i==j)
map1[i][j]=0;
else
map1[i][j]=5000;
}
}

void dij()
{
bool flag[505];
int lowcost[505];
int prev[505];
for(int i=1; i<=n; i++)
{
lowcost[i]=5000;
flag[i]=false;
prev[i]=-1;
}
lowcost[1]=0;
//for(int i = 1; i <= n; i++)
//lowcost[i] = map1[1][i];
//cout<<lowcost[7]<<endl;
for(int j=1; j<=n; j++)
{
int k=-1;
int Min=5000;
for(int i=1; i<=n; i++)
{
if(!flag[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
}
if(k==-1)
break;
flag[k]=true;
for(int i=1; i<=n; i++)
{
if(!flag[i]&&lowcost[k]+map1[k][i]<lowcost[i])
{
lowcost[i]=lowcost[k]+map1[k][i];
prev[i]=k;
//cout<<"kkk"<<endl;
}
}
}
if(lowcost
<5000)
cout<<lowcost
-1<<endl;
else
cout<<"NO"<<endl;
}

int main()
{
cin>>t;
while(t--)
{
cin>>m>>n;
getchar();
cleaner();
for(int i=0; i<m; i++)
{
gets(str);
g=0;
for(int j=0; j<strlen(str); j++)
{

if(str[j]!=' ')
{
int sum=0;
while(str[j] != ' ' && j < strlen(str))
{
sum = sum*10 + (str[j] - '0');
j++;
}//处理多位数,比较坑
lim[g++]=sum;
}
}
for(int b=0; b<=g; b++)
{
for(int k=b+1; k<=g; k++)
{
map1[lim[b]][lim[k]]=1;
}
}
}//处理字符串
/*for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
cout<<map1[j][i];
}
cout<<endl;
}*/
dij();
}

return 0;
}
tips:这道题prev【505】可以不要,我是为了方便找错。另外数据不大,弗洛伊德也是可以的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: