Meeting

Time limit: 2.0 second
Memory limit: 64 MB
K
friends has decided to meet in order to celebrate their victory at the
programming contest. Unfortunately, because of the tickets rise in price
there is a problem: all of them live in different parts of the city,
and they are to choose a place of meeting so that they wouldn't pay too
much for the tickets. You are to help them make the best choice.
All stops are enumerated with integers 1, …, N inclusive. There are M
tram routes in the city (the friends take only trams and do not go on
foot from stop to stop). For each route numbers of its stops are known.
For each friend we know an amount of money he has and whether he has a
month tram ticket. A ticket price equals 4 rubles.
You
are to find out a stop number, such that all of the friends might come
there and the sum of money they spend for their tramps would be minimal.
Naturally, they may change routes (it means that each one may make
changes on his way to the required stop). Note, that changing the route
one has to pay for a new ticket: the friends are honest people — they do
always pay for tickets. Everyone pays for a ticket from his own money.
No one is to leave money for the return tickets.

Input

The first line contains two integers N and M; 1 ≤ N, M ≤ 100 (N is a number of stops, M is a number of routes). The next M lines define the routes in the following sort: there is an integer L in the beginning of a line — that is an amount of stops of the corresponding route (2 ≤ L ≤ 100). Then L
integers defining stops numbers of the route follow. The numbers are
separated with a space. A route is defined by its stops along the line
in one direction.

The next line contains an integer K (1 ≤ K ≤ 100), that is an amount of friends. The next K
lines contain information about each of them (one line for one person):
there is a positive integer in the beginning of a line that is an
amount of money (in rubles) the person has, then a number of a stop that
he goes there from his home on foot, then 0 (if this person has no
month ticket) or 1 (if he has). The numbers in a line are separated with
a space. No one of the friends has more than 1000 rubles.

Output

Output
a number of a stop that is a meeting
point (if there are several numbers choose the minimal one) and a total
sum of money (in rubles) that the friends has paid for their trips to
the appointed place. The numbers should be separated with a space. If
the friends won't be able to meet at one stop, output the only number 0.

Sample

input output
4 3
2 1 2
2 2 3
2 3 4
3
27 1 0
15 4 0
45 4 0
4 12
Problem Author: Alexander Somov
【题意】一个城市中有很多公交站,每条公交路线链接一些公交站(双向),每辆公交车车票为4卢布。有那么一群朋友住在其中的一些车站,他们想选择一个公交站聚会,使得每个人都能靠自己的钱到达聚会地点,且总花费最短。现给定所有人的钱,出发地点,是否具有月票(有月票的不需要花钱),求聚会地点(若有多个满足条件,输出编号最小的)和总花费。
【分析】考虑到一条公交路线上的点只需要花一张车票,所以将一条公交路线上的点的距离都赋值1,然后Floyd求出任意两点最短路,然后枚举答案。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
typedef long long ll;
using namespace std;
const int N = 1e3+;
const int M = +;
const int mod=1e9+;
int n=,m,k,tot=,t;
int head[N],vis[N],in[N],sum[N];
int s[N],dis[N][N],mo[N];
vector<int>vec,vv[N];
void Floyd(){
for(int k=;k<=n;k++){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(dis[i][k]!=inf&&dis[k][j]!=inf&&dis[i][j]>dis[i][k]+dis[k][j]){
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}return;
}
int main()
{
met(dis,inf);
for(int i=;i<N;i++)dis[i][i]=;
int u,v;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d",&k);
while(k--){
scanf("%d",&u);
vec.pb(u);
}
for(int i=;i<vec.size();i++){
for(int j=i+;j<vec.size();j++){
dis[vec[i]][vec[j]]=dis[vec[j]][vec[i]]=;
}
}vec.clear();
}
Floyd();
scanf("%d",&k);
for(int i=;i<=k;i++){
scanf("%d%d%d",&mo[i],&s[i],&vis[i]);
mo[i]/=;
}
int ans=inf;
for(int i=;i<=n;i++){
int sum=;
for(int j=;j<=k;j++){
if((!vis[j]&&mo[j]<dis[i][s[j]])||dis[i][s[j]]==inf){sum=inf;break;}
if(!vis[j]&&mo[j]>=dis[i][s[j]])sum+=dis[i][s[j]];
}
if(sum==inf)continue;
if(sum<ans){
ans=sum;vv[ans].pb(i);
}
else if(sum==ans&&ans!=inf)vv[ans].pb(i);
}
if(ans!=inf){sort(vv[ans].begin(),vv[ans].end()); printf("%d %d\n",vv[ans][],ans*);}
else printf("0\n");
return ;
}

URAL 1085 Meeting(最短路)的更多相关文章

  1. hdu-5521 Meeting(最短路)

    题目链接: Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  2. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  3. 2015沈阳区域赛Meeting(最短路 + 建图)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. URAL 1072 Routing(最短路)

    Routing Time limit: 1.0 secondMemory limit: 64 MB There is a TCP/IP net of several computers. It mea ...

  5. 2015沈阳站-Meeting 最短路

    http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意:A,B两个人分别在1和n区.给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个 ...

  6. [hdu5521 Meeting]最短路

    题意:有N个点,给定M个集合,集合Si里面的点两两之间的距离都为Ti,集合里面的所有点数之和<=1e6.有两个人分别在1和N处,求1个点使得两个人到这一点距离的最大值最小 思路:这题是裸的最短路 ...

  7. URAL题解二

    URAL题解二 URAL 1082 题目描述:输出程序的输入数据,使得程序输出"Beutiful Vasilisa" solution 一开始只看程序的核心部分,发现是求快排的比较 ...

  8. Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)

    1741. Communication Fiend Time limit: 1.0 second Memory limit: 64 MB Kolya has returned from a summe ...

  9. HDU 5521 Meeting(虚拟节点+最短路)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

随机推荐

  1. mysql一次添加多条记录

    inisert into tabale (name,pwd) values ("jom","123"),("tom","123&q ...

  2. HDU 4627 E(Contest #3)

    Description There are many unsolvable problem in the world.It could be about one or about zero.But t ...

  3. VC单文档对话框添加托盘图标

    一 单文档添加托盘 1. 在CMainFrame中定义NOTIFYICONDATA结构m_notify 2.在OnCreate中添加托盘初始化代码 int CMainFrame::OnCreate(L ...

  4. Android Studio如何发布APK

    (1)Android Studio菜单Build->Generate Signed APK (2)弹出窗口 (3)创建密钥库及密钥,创建后会自动选择刚创建的密钥库和密钥(已拥有密钥库跳过)    ...

  5. 《CheckboxDemo.java》

    import java.awt.*; import java.applet.Applet; public class CheckboxDemo extends Applet { String Uni[ ...

  6. 《c语言全局变量的用法》

    //全局变量的用法. /*有一个一维数组,内放n个学生的成绩,(n由用户自己指定,通过调用函数实现定义一个数组.)写一个函数,当主函数调用此函数后,能求出平均分,最高分,最低分.*/ #include ...

  7. 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

    Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...

  8. WIN中SharePoint Server 2010 入门安装部署详解

    目前流行的原始安装文件基本都是这样的:Windows Server 2008 R2+SQL Server 2008R2+SharePoint Server 2010     这个初始环境原本也无可厚非 ...

  9. (转)SQLLite数据操作

    原文:http://dreamboy.blog.51cto.com/3180937/722352 SQLLite数据操作 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存 ...

  10. 详解Java中的访问控制修饰符(public, protected, default, private)

    Java中的访问控制修饰符已经困惑笔者多时,其中较复杂的情况一直不能理解透彻.今天下定决心,系统.全面地研究Java中的访问控制修饰符的所有方面,并整理成这篇文章,希望有同样疑惑的读者读完后能有所收获 ...