hdoj 2066 一个人的旅行 【多源多汇最短路】
方法:缩点 + 最短路
分析:看了大神的一篇博客,讲冗余压缩的,然后就想找一个多源最短路练练手。
这个题目就是典型的多源多汇最短路
方法:把全部的源点压缩成一个点,然后汇点压缩成一个点,然后跑最短路
注意:
1:求最短路的时候邻接表存储有重边不影响结果。
2:此题有重边。
3:要特殊处理源点和汇点是同一个点的情况。为0
AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1050;
int mp[N][N];
map<int,int> ma;
struct Node
{
int to,val;
};
vector<Node> v[N];
void add_Node(int x,int y,int z)
{
v[x].push_back((Node){y,z});
v[y].push_back((Node){x,z});
} int dis[N];
bool ok[N];
void spfa(int s)
{
queue<int> q;
q.push(s);
memset(dis,inf,sizeof(dis));
dis[s]=0;
while(!q.empty())
{
int tmp=q.front();
q.pop();
for(int i=0;i<v[tmp].size();i++)
{
if(dis[v[tmp][i].to]>dis[tmp]+v[tmp][i].val)
{
dis[v[tmp][i].to]=dis[tmp]+v[tmp][i].val;
q.push(v[tmp][i].to);
}
}
}
} void MP_clear(int n)
{
ma.clear();
for(int i=0;i<=n;i++)
v[i].clear();
}
int main()
{
int t,s,d;
while(~scanf("%d%d%d",&t,&s,&d))
{
memset(mp,inf,sizeof(mp));
int ma_x=0,ma_y=0;
for(int i=0;i<t;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
mp[x][y]=min(z,mp[x][y]);
ma_x=max(ma_x,x);
ma_y=max(ma_y,y);
}
memset(ok,0,sizeof(ok));
int ss=max(ma_x,ma_y)+2,tt=max(ma_x,ma_y)+1;
for(int i=0;i<s;i++)
{
int x;scanf("%d",&x);
ma[x]=ss;
ok[x]=1;
}
int ff=0;
for(int i=0;i<d;i++)
{
int x;
scanf("%d",&x);
ma[x]=tt;
if(ok[x] && ff==0)
ff=1;
}
if(ff==1)
{
printf("0\n");
continue;
}
for(int i=1;i<=ma_x;i++)
{
for(int j=1;j<=ma_y;j++)
{
if(mp[i][j]!=inf)
{
int xx=i,yy=j;
if(ma[i])
xx=ma[i];
if(ma[j])
yy=ma[j];
add_Node(xx,yy,mp[i][j]);
}
}
}
spfa(ss);
printf("%d\n",dis[tt]);
MP_clear(ss);
}
return 0;
}
hdoj 2066 一个人的旅行 【多源多汇最短路】的更多相关文章
- Vijos 1006 晴天小猪历险记之Hill 单源单汇最短路
背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结-- 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴天小猪自告奋勇 ...
- hdoj 2066 一个人的旅行
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...
- POJ1511 Invitation Cards(多源单汇最短路)
边取反,从汇点跑单源最短路即可. #include<cstdio> #include<cstring> #include<queue> #include<al ...
- 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路
1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...
- 2015南阳CCPC F - The Battle of Guandu 多源多汇最短路
The Battle of Guandu Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description In the year of 200, t ...
- hdu 2066 一个人的旅行
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2066 一个人的旅行 Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷 ...
- poj1459 Power Network (多源多汇最大流)
Description A power network consists of nodes (power stations, consumers and dispatchers) connected ...
- 2018.07.06 POJ 1459 Power Network(多源多汇最大流)
Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power network consists of nodes ...
- poj2112 二分+floyd+多源多汇最大流
/*此题不错,大致题意:c头牛去k个机器处喝奶,每个喝奶处最多容纳M头牛,求所有牛中走的最长路的 那头牛,使该最长路最小.思路:最大最小问题,第一灵感:二分答案check之.对于使最长路最短, 用fo ...
随机推荐
- Vedis - An Embeddable Datastore Engine
Vedis - An Embeddable Datastore Engine An Embeddable Datastore Engine Tweet Follo ...
- [cocos2d-x]针对不同的设备,选取不同的自适应图片
前言: 我们在进行移动设备开发的时候,我们常常会准备不同大小的图片资源以适应不同大小的设备,下面我称普清图片资源和高清图片资源.那么如何做到图片资源的自适应呢?下面我来用一个demo展示一下这个效果的 ...
- POJ 3422 Kaka's Matrix Travels (最小费用最大流)
POJ 3422 Kaka's Matrix Travels 链接:http://poj.org/problem? id=3422 题意:有一个N*N的方格,每一个方格里面有一个数字.如今卡卡要从左上 ...
- 关于Dropdownlist使用的心得体会
2013-07-23关于Dropdownlist使用的心得体会: Dropdownlist使用最多的几个属性: 一.Dropdownlist.Items,负责包含所有选项的容器 DropDownLis ...
- iOS 用GDataXMLNode创建和解析XML
原文地址:http://blog.csdn.net/gf771115/article/details/7718403 NSError *error; // NSString *path = [[ ...
- java中可以出现的中文乱码的集中解决
从学习javaweb开始就会经常遇到中文乱码,今天就做以下记录: 1. 要避免项目中遇到乱码,首先就是在搭建项目的设置工作空间的字符编码,若是多人开发,就更应该做到统一,在eclipse中选择widn ...
- handler.postDelayed()和timerTask
public static void scrollToListviewTop(final XListView listView) { listView.smoothScrollToPosition(0 ...
- Laravel创建Model
它已被用于CI框架.最近学习使用Laravel框架,要总结一些遇到的问题是一个创纪录,供以后调用.此外,我希望能够碰到同样的问题的朋友的帮助. 在Laravel数据库表是根据Laravel写好的程序去 ...
- 《大象UML》看书笔记2:
<大象UML>看书笔记2 抽象角度: 在为现实世界建模的时候,首先要搞清楚有多 ...
- BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )
每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- ...