POJ 3268

来源:互联网 发布:java 浏览器输入框 编辑:程序博客网 时间:2024/06/06 14:11

题目翻译来自:http://poj.org/showmessage?message_id=97785

描述一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。每头母牛必需参加宴会并且在宴会结束时回到自己的领地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。求每头牛要来回的最短时间。输入第一行:三个用空格分开的整数:N,M和X第2到第M+1行:第i+1描述路i,通过三个用空格分开的整数: Ai, Bi和Ti. 是对于从Ai号田到 Bi号田的描述,需要Ti的时间.输出第一行:一个整数:对于每头牛所必须花费的时间.(在这段时间内,每头牛可以来回)

老老实实两次Dijkstra呗……

两次都是从x点出发,第一次是按输入生成的正常的图,这样dijkstra后得到的是每头牛去参加宴会的最短时间,

第二次是将图上每条边都翻转一个方向后得到的图,这样dijkstra后得到的是每头牛宴会回来的时间。

#include<cstdio>#include<cstring>#define INF 1000000000using namespace std;int n,m,x;int edge1[1005][1005],edge2[1005][1005],d1[1005],d2[1005];bool vis[1005];void dijkstra(int edge[][1005],int d[]){for(int i=1;i<=n;i++){i==x ? d[i]=0 : d[i]=INF;vis[i]=0;}for(int i=1;i<=n;i++){int min=INF,u;for(int j=1;j<=n;j++) if(!vis[j] && d[j] < min) min=d[(u=j)];vis[u]=1;for(int v=1;v<=n;v++) if(!vis[v] && edge[u][v] != INF && d[v] > d[u]+edge[u][v]) d[v]=d[u]+edge[u][v];}}int main(){scanf("%d%d%d",&n,&m,&x);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(i==j) edge1[i][j]=0 , edge2[i][j]=0;else edge1[i][j]=INF , edge2[i][j]=INF;}for(int i=1;i<=m;i++){int u,v,t; scanf("%d%d%d",&u,&v,&t);edge1[u][v]=t;edge2[v][u]=t;}dijkstra(edge1,d1);dijkstra(edge2,d2);int max=-1;for(int i=1;i<=n;i++){if(i==x) continue;if(max<d1[i]+d2[i]) max=d1[i]+d2[i];}printf("%d\n",max);}

然后是将dijkstra改成spfa:

#include<cstdio>#include<cstring>#include<queue>#define INF 1000000000using namespace std;int n,m,x;int edge1[1005][1005],edge2[1005][1005],d1[1005],d2[1005];bool vis[1005];void spfa(int edge[][1005],int d[]){for(int i=1;i<=n;i++){    i==x ? d[i]=0 : d[i]=INF;    vis[i]=0;}queue<int> q;q.push(x);vis[x]=1;while(!q.empty())    {        int u=q.front();q.pop();vis[u]=0;        for(int v=1;v<=n;v++)        {            if(edge[u][v]==INF) continue;            int tmp=d[v];            if(d[v]>d[u]+edge[u][v]) d[v]=d[u]+edge[u][v];            if(d[v]<tmp && !vis[v]) q.push(v),vis[v]=1;        }    }}int main(){scanf("%d%d%d",&n,&m,&x);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(i==j) edge1[i][j]=0 , edge2[i][j]=0;else edge1[i][j]=INF , edge2[i][j]=INF;}for(int i=1;i<=m;i++){int u,v,t;scanf("%d%d%d",&u,&v,&t);edge1[u][v]=t;edge2[v][u]=t;}spfa(edge1,d1);spfa(edge2,d2);int max=-1;for(int i=1;i<=n;i++){if(i==x) continue;if(max<d1[i]+d2[i]) max=d1[i]+d2[i];}printf("%d\n",max);}


可以看到用spfa使得程序快很多。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 室友考研要跟我考一样的学校怎么办 药流第一天才吃了一粒米非司怎么办 药流半月同房第二天大出血怎么办 口臭想让它变得不臭怎么办 来单位干了几天不满意想离职怎么办 药流吃药期间吃什么吐什么怎么办 养狗家里味道大怎么办养花有用吗 第一天上班站的脚疼怎么办 入职没有人事所需要的证书怎么办 入职第一天后不想去了怎么办 警察在执法过程中殴打群众怎么办 肾结石打了3天针痛得厉害怎么办 征兵体检过了到部队退兵怎么办 圆通快递要求退回结果被签收怎么办 新生儿蛋蛋淹了破皮了怎么办 要是和同学玩的时候打到睾丸怎么办 睾丸撞了一下里面碎了怎么办 睾丸被蚊子咬了挠坏流水疼怎么办 沐浴乳大量的灌注到尿道里怎么办 当电脑显示有文件损害时怎么办? 电脑上的压缩包手机上打不开怎么办 第五人格多酷账号退出了怎么办 更新显卡驱动时屏幕关闭了怎么办 不知道杯孕做了两次C丁怎么办 小说签约后更不到要求的字数怎么办 电脑中了感染病毒杀不干净怎么办 电脑下载的软件有病毒了怎么办 电脑强制关机后开不了机怎么办 受刺激后出现精神异常该怎么办 当屏幕出现暂时无法移动时怎么办 英雄联盟欧服连接不上服务器怎么办 试客联盟认证手机号成空号了怎么办 汽车脚垫不贴合翘起来了怎么办 版权保护迅雷下载不了的资源怎么办 30岁在外地城市找不到工作怎么办 新买的苹果爱拍充不进去电是怎么办 绝地求生东南亚服匹配不到人怎么办 电脑卡住了怎么办鼠标也点不动 幽灵行动荒野没有主线任务了怎么办 拼多多购买的东西下架了怎么办 电脑版的荒野行动玩的时候卡怎么办