正经写的第一个C++程序,也是写的第一个迪科斯彻算法题。
迪科斯彻算法本质还是贪心。
HDOJ-2112HDU Today
题目
HDU Today
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 42251 Accepted Submission(s): 10096
Problem Description
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
Sample Input
6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
Sample Output
50
Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake
虽然偶尔会迷路,但是因为有了你的帮助
和从此还是过上了幸福的生活。
――全剧终――
AC的代码
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
using namespace std;
void dijkstra(int beg,int n);
int citymap[200][200],dist[200],flag[200];//分别为地图,最短时间,站点最短路是否确定
//int pre[200];//当前最短路之前站点
const int INF=0x3f3f3f3f;
int main()
{
int n,time;
string start,target,s1,s2;
map<string,int>QAQ;
while(scanf("%d",&n)==1&&n!=-1){
QAQ.clear();
memset(citymap,INF,sizeof(citymap));
// memset(pre,-1,sizeof(int));
memset(flag,0,sizeof(flag));
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// citymap[i][j]=INF;
// }
// }
int cnt=0;
cin>>start>>target;
if(!QAQ[start])
QAQ[start]=++cnt;
if(!QAQ[target])
QAQ[target]=++cnt;
for(int i=0;i<n;i++){
cin>>s1>>s2>>time;
if(!QAQ[s1])
QAQ[s1]=++cnt;
if(!QAQ[s2])
QAQ[s2]=++cnt;
if(time<citymap[QAQ[s1]][QAQ[s2]]){
citymap[QAQ[s1]][QAQ[s2]]=time;
citymap[QAQ[s2]][QAQ[s1]]=time;
}
}
if(start==target){
cout<<"0"<<endl;
}
else
dijkstra(QAQ[start],cnt);
// {
// printf("\n******\n");
// for(int i=1;i<=cnt;i++){
// for(int j=1;j<=cnt;j++){
cout<<citymap[i][j]<<' ';
// printf("%10d ",citymap[i][j]);
// }
// cout<<endl;
// }
// cout<<endl;
// printf("dist:\n");
// for(int i=1;i<=cnt;i++)
// printf("%d ",dist[i]);
// printf("\nflag:\n");
// for(int i=1;i<=cnt;i++)
// printf("%d ",flag[i]);
// printf("\n******\n");
// }
if(dist[QAQ[target]]==INF&&start!=target)
cout<<"-1"<<endl;
else if(start!=target)
cout<<dist[QAQ[target]]<<endl;
}
return 0;
}
void dijkstra(int beg,int n)//起点和车站个数
{
for(int i=1;i<=n;i++){
dist[i]=citymap[beg][i];
// flag[i]=0;
// if(citymap[beg][i]==INF)
// pre[i]=-1;
// else
// pre[i]=beg;
}
dist[1]=0;
flag[beg]=1;
// pre[beg]=-1;
for(int i=1;i<=n;i++){
int temp=INF,t=beg;
for(int j=1;j<=n;j++){
if(dist[j]<temp&&!flag[j]){//寻找未确定点到源点最短路的点
t=j;
temp=dist[j];
}
}
if(t==beg)
return;
else
flag[t]=1;//t无法借助其他路径优化,即为最短
// {
// printf("\n******\n");
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
cout<<citymap[i][j]<<' ';
// printf("%10d ",citymap[i][j]);
// }
// cout<<endl;
// }
// cout<<endl;
// printf("dist:\n");
// for(int i=1;i<=n;i++)
// printf("%d ",dist[i]);
// printf("\nflag:\n");
// for(int i=1;i<=n;i++)
// printf("%d ",flag[i]);
// printf("\n******\n");
// }
for(int j=1;j<=n;j++){
if(citymap[t][j]<INF&&!flag[j]&&(dist[t]+citymap[t][j])<dist[j]){
dist[j]=dist[t]+citymap[t][j];
// pre[j]=t;
}
}
}
}
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
---|---|---|---|---|---|---|---|---|
29218207 | 2019-05-14 22:50:22 | Accepted | 2112 | 1887MS | 1980K | 3627 B | C++ | Overstars |
29217898 | 2019-05-14 22:18:44 | Wrong Answer | 2112 | 1872MS | 1984K | 2850 B | C++ | Overstars |
因为初始化问题WA了两天……提交记录太长我就不复制了……
调试用的代码块不删了,注释掉就得了
C++关键字真多,map真好用,memse用起来似乎和C语言感觉不一样。
2019年5月14日
再补一个(伪)多源最短路
题目HDOJ-2066 一个人的旅行
Problem Description
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,0),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
AC的代码
#include<iostream>
#include<cstdio>
#include<climits>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
void dijkstra(int beg,int n);
int dist[1002],city[1002][1002];
bool flag[1002];
int main()
{
int t,s,d,i,j,x,y,mini;
int sc[1002],dc[1002];
while(cin>>t>>s>>d){
memset(city,INF,sizeof(city));
mini=INF;
int cnt=0,time;
for(i=1;i<=t;i++){//输入部分开始
scanf("%d %d %d",&x,&y,&time);
if(x>cnt||y>cnt)
cnt=max(x,y);
if(time<city[x][y])
city[x][y]=city[y][x]=time;
}
for(i=1;i<=cnt;i++)
city[i][i]=0;
for(i=1;i<=s;i++)
scanf("%d",&sc[i]);
for(i=1;i<=d;i++)
scanf("%d",&dc[i]);
for(i=1;i<=s;i++){//计算部分开始
memset(dist,INF,sizeof(dist));
memset(flag,0,sizeof(flag));
dijkstra(sc[i],cnt);
for(j=1;j<=d;j++){
if(dist[dc[j]]<mini)
mini=dist[dc[j]];
}
}
printf("%d\n",mini);
}
return 0;
}
void dijkstra(int beg,int n)
{
for(int i=1;i<=n;i++){
dist[i]=city[beg][i];
}
// dist[beg]=0;//到自己的距离
flag[beg]=1;
for(int i=1;i<=n;i++){
int temp=INF,t=beg;
for(int j=1;j<=n;j++){
if(dist[j]<temp&&!flag[j]){//寻找未确定点到源点最短路的点
t=j;
temp=dist[j];
}
}
if(t==beg)
return;
else
flag[t]=1;//起始地到t路径无法再借助其他路径优化,即为最短
for(int j=1;j<=n;j++){
if(city[t][j]<INF&&!flag[j]&&(dist[t]+city[t][j])<dist[j]){
dist[j]=dist[t]+city[t][j];//尝试用t的路径优化其他未确定最短路的点
}
}
}
}
写法就是单源最短路变换起始点,记录最小的距离,输出……
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
---|---|---|---|---|---|---|---|---|
29448012 | 2019-06-17 10:27:40 | Accepted | 2066 | 31MS | 5728K | 1683 B | C++ | Overstars |
29447984 | 2019-06-17 10:17:01 | Time Limit Exceeded | 2066 | 1000MS | 5720K | 1681 B | C++ | Overstars |
29447982 | 2019-06-17 10:15:14 | Time Limit Exceeded | 2066 | 1000MS | 5756K | 1678 B | C++ | Overstars |
29447962 | 2019-06-17 10:08:51 | Time Limit Exceeded | 2066 | 1000MS | 5772K | 1670 B | C++ | Overstars |
29447957 | 2019-06-17 10:07:44 | Compilation Error | 2066 | 0MS | 0K | 1649 B | C++ | Overstars |
2019年6月17日10点30分