标签:acm algorithm graphs dijkstra priority_queue
虚拟城市是一个基于Windows平台的2D经营策略游戏。你可以在游戏中建造各种各样的建筑(公园、雕塑、喷泉、小屋、公寓、办公区、商场写字楼、综合办公楼、办公大楼、现代化摩天大楼等)、道路,也可以销毁他们, 当然建造、销毁它们都要花费资金,你可以通过每月的税收赚钱,就像专业的大型策略游戏一样。
第一行输入一个数T,表示测试数据个数,对于每组测试数据,第一行输入两个数n, m(2<=n<=50, 0<=m<=n*(n-1)),表示有n个车站,且这n个车站之间共存在m辆巴士。接下来,输入m行,每行两个数x, y(1<=x, y<=n),表示x和y之间有一辆巴士,且如果容量满足v(x)>=v(y)时,这辆巴士不会被停运,即可以将人们从x输送至y,但是无论容量怎么变,这辆车是不负责将人们从y输送至x。题目保证x和y不相同,也保证不会有两辆巴士有相同的起点和终点。接下来一行输入n个数,表示初始状态下n个车站的容量。(1<=v(i)<=10^9)
33 41 22 12 33 230 20 102 21 22 110 203 21 22 110 10 10
010-1
#include<map> #include<set> #include<queue> #include<stack> #include<cmath> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 2500 + 5; const int maxv = 200000 + 5; const ll max_dis = 1e18 + 5; int T; int n,m,a,b; int tmap[55][55]; int dist[55]; ll dis[maxn]; struct Edge{ int to,dis; Edge(){} Edge(int to,int dis){ this -> to = to; this -> dis = dis; } }; vector<Edge>graph[maxn]; typedef pair<int,int>P; void init(){ memset(tmap,0,sizeof(tmap)); for(int i=0;i<maxn;i++) graph[i].clear(); } void input(){ scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); tmap[a][b]=1; } for(int i=1;i<=n;i++) scanf("%d",&dist[i]); } //把一个点分成n个点,然后连边 void add(int u,int v){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(dist[i]>=dist[j]) graph[(u-1)*n+i].push_back(Edge((v-1)*n+j,abs(dist[j]-dist[v]))); } } } void createGraph(){ for(int i=1;i<=n;i++){ graph[0].push_back(Edge(i,abs(dist[i]-dist[1]))); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(tmap[i][j]){ add(i,j); } } } } ll dijkstra(int s){ fill(dis,dis+maxn,max_dis); priority_queue<P,vector<P>,greater<P> >q; while(!q.empty()) q.pop(); dis[s]=0; q.push(P(0,s)); while(!q.empty()){ P p=q.top();q.pop(); int u=p.second; if(p.first>dis[u]) continue; for(int i=0;i<graph[u].size();i++){ Edge& e=graph[u][i]; if(dis[e.to]>dis[u]+e.dis){ dis[e.to]=dis[u]+e.dis; q.push(P(dis[e.to],e.to)); } } } ll ans=max_dis; //车站n所形成的点是(n-1)*n+1~n*n for(int i=(n-1)*n+1;i<=n*n;i++){ ans=min(ans,dis[i]); } if(ans==max_dis) return -1; return ans; } void solve(){ createGraph(); printf("%lld\n",dijkstra(0)); } int main(){ //freopen("cin.txt","r",stdin); scanf("%d",&T); while(T--){ init(); input(); solve(); }return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:acm algorithm graphs dijkstra priority_queue
原文地址:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/47187101