http://acm.timus.ru/problem.aspx?space=1&num=1085
简单floy 不过有细节需要注意
首先是常识性的 tram 好像是环行的 还有就是如果有月票他不需要花钱但前提他要去的点有路可走
代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #include<set> #include<map> #include<string> #include<queue> #include<stack> #include <iomanip> using namespace std; #define LL long long const int INF=0x3f3f3f3f; //priority_queue<int,vector<int>,greater<int> >qt; const int N=105; int dist[N][N]; struct people { int money,s,k; }mem[N]; int main() { //freopen("data.in","r",stdin); for(int i=0;i<N;++i) for(int j=0;j<N;++j) if(i==j)dist[i][j]=0; else dist[i][j]=INF; int n,m,p; cin>>n>>m; int road[N]; while(m--) { int len; cin>>len; for(int i=0;i<len;++i) { cin>>road[i]; for(int j=0;j<i;++j) { dist[road[j]][road[i]]=4; dist[road[i]][road[j]]=4; } } } for(int l=1;l<=n;++l) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(dist[i][j]>dist[i][l]+dist[l][j]) dist[i][j]=dist[i][l]+dist[l][j]; /* for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) cout<<i<<"--->"<<j<<": "<<dist[i][j]<<endl; */ cin>>p; for(int i=0;i<p;++i) cin>>mem[i].money>>mem[i].s>>mem[i].k; int MIN=INF; int X=0; for(int i=1;i<=n;++i) { int tmp=0; for(int j=0;j<p;++j) { int s=mem[j].s; if(mem[j].k==1&&dist[s][i]!=INF) continue; if(mem[j].money<dist[s][i]) {tmp=INF;break;} //cout<<s<<" "<<i<<endl; //cout<<tmp<<" "<<dist[s][i]<<endl; tmp+=dist[s][i]; }//cout<<MIN<<" "<<tmp<<endl; if(tmp<MIN) { MIN=tmp; X=i; } } if(MIN==INF) cout<<"0"<<endl; else cout<<X<<" "<<MIN<<endl; return 0; }