2019.5.14HDOJ-2112HDU Today(单源最短路),AC率23.90%(10096/42251)

正经写的第一个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 IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
292182072019-05-14 22:50:22Accepted21121887MS1980K3627 BC++Overstars
292178982019-05-14 22:18:44Wrong Answer21121872MS1984K2850 BC++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 IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
294480122019-06-17 10:27:40Accepted206631MS5728K1683 BC++Overstars
294479842019-06-17 10:17:01Time Limit Exceeded20661000MS5720K1681 BC++Overstars
294479822019-06-17 10:15:14Time Limit Exceeded20661000MS5756K1678 BC++Overstars
294479622019-06-17 10:08:51Time Limit Exceeded20661000MS5772K1670 BC++Overstars
294479572019-06-17 10:07:44Compilation Error20660MS0K1649 BC++Overstars

2019年6月17日10点30分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值