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 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分

发布了71 篇原创文章 · 获赞 12 · 访问量 7554

猜你喜欢

转载自blog.csdn.net/Miaplacidus/article/details/90217124