176. [USACO Feb07] 奶牛聚会
★☆ 输入文件:sparty.in
输出文件:sparty.out
简单对比
时间限制:3 s 内存限制:16 MB
译: zqzas
N(1 ≤ N ≤ 1000)个农场中的每个农场都有一只奶牛去参加位于第X个农场的聚会.共有M (1 ≤ M ≤ 100,000)条单向的道路,每条道路连接一对农场.通过道路i会花费Ti (1 ≤ Ti ≤ 100)的时间.
作为参加聚会的奶牛必须走到聚会的所在地(农场X).当聚会结束时,还要返回各自的农场.奶牛都是很懒的,她们想找出花费时间最少的路线.由于道路都是单向的,所有她们前往农场X的路线可能会不同于返程的路线.
Of all the cows, what is the longest amount of time a cow must spend walking to the party and back? 对于所有参加聚会的奶牛,找出前往聚会和返程花费总时间最多的奶牛,输出这只奶牛花费的总时间.
输入格式:
- 第1行:三个用空格隔开的整数.
第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.
输出格式:
- 唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.
样例输出:
4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3
样例输入:
10
样例说明:
共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.
第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.
我猜这一道题(可能)很简单<<不要相信我的胡言
自认为这一道题就是正反跑两遍dijkstra就行啦~
然后找两个dis和最大的QAQ 天哪
这一道题的数据范围看起来好可怕的样子
dijkstra是m logm m是10万(像是能卡过的样子<<肯定能啊) 来吧~
正反建边 一遍水过!
#include<bits/stdc++.h> #define maxn 1005 #define pa pair<int,int> using namespace std; int n,m,p; vector<int> v[maxn],w[maxn]; vector<int> v2[maxn],w2[maxn]; int dis2[maxn],vis2[maxn]; int dis[maxn],vis[maxn]; priority_queue<pa,vector<pa>,greater<pa> > q; void Dijkstra()//back { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[p]=0; q.push(make_pair(0,p)); while(!q.empty()) { int x=q.top().second; q.pop(); if(vis[x]) continue; vis[x]=1; for(int i=0;i<v[x].size();i++) { int y=v[x][i]; int val=w[x][i]; if(dis[y]>dis[x]+val) { dis[y]=dis[x]+val; q.push(make_pair(dis[y],y)); } } } } void Dijkstra2()//to_p { memset(dis2,0x3f,sizeof(dis2)); memset(vis2,0,sizeof(vis2)); dis2[p]=0; q.push(make_pair(0,p)); while(!q.empty()) { int x=q.top().second; q.pop(); if(vis2[x]) continue; vis2[x]=1; for(int i=0;i<v2[x].size();i++) { int y=v2[x][i]; int val=w2[x][i]; if(dis2[y]>dis2[x]+val) { dis2[y]=dis2[x]+val; q.push(make_pair(dis2[y],y)); } } } } int main() { freopen("sparty.in","r",stdin); freopen("sparty.out","w",stdout); scanf("%d%d%d",&n,&m,&p); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); v[x].push_back(y); w[x].push_back(z); v2[y].push_back(x); w2[y].push_back(z); } Dijkstra(); Dijkstra2(); int Max=-1; for(int i=1;i<=n;i++) Max=max(Max,dis[i]+dis2[i]); printf("%d",Max); return 0; }
♪(^∇^*)