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】可以不要,我是为了方便找错。另外数据不大,弗洛伊德也是可以的
基本没难点,最基础的迪杰斯特拉。输入用字符串处理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】可以不要,我是为了方便找错。另外数据不大,弗洛伊德也是可以的
相关文章推荐
- osgi系列之二 集成log4j
- HDU——2004 成绩转换
- myeclipse中间classpath
- react-native学习笔记——简单尝试
- 004--C++11的初始化方式
- 好听的英文歌曲
- 关于nodeJS的配置
- 数组的学习和常用方法总结(2)
- struts 中default-action-ref的问题
- 前端模块化
- Shell Script_简要总结
- 从《孙子兵法》看管理
- PERIXX512键盘的使用体验
- J2EE项目从Myeclipse中转换到eclipse中
- Android供TextView添加多个点击文字
- AppStore上架问题ERROR ITMS-90049
- CAS实现SSO单点登录原理
- C++代码优化方法总结
- 字母大小写转化
- Solr 5.3.0集成mmseg4j、tomcat部署、Solrj 5.3.0使用