XDOJ 1090: 爬树的V8
题意:本着切水题的态度,做了这个题,然后发现是最短路的变形,而且数据很小,floyd口胡觉得能过,具体没试,直接上自己研究的dij+优先队列,事实上跑的还是比别人慢,333;
#include<algorithm> #include<iostream> #include<map> #include<set> #include<vector> #include<stack> #include<queue> #include<cstring> #include<cstdio> #define INF 0 using namespace std; typedef struct node{ int x; int d; int date; }node; struct cmp{ bool operator()(node a,node b){ return a.d<b.d; } }; int dis[10005]; bool vis[10005]; int main(){ int m; vector<node>vec[10005]; while(cin>>m){ int n; cin>>n; int a,b,c; int ans=-1; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ cin>>a>>b>>c; ans=max(ans,a); ans=max(ans,b); node r; r.x=b;r.d=INF;r.date=c; vec[a].push_back(r); } memset(dis,INF,sizeof(dis)); dis[1]=0; priority_queue<node,vector<node>,cmp>que; node u; u.d=0;u.date=0;u.x=1; que.push(u); while(!que.empty()){ node p=que.top(); que.pop(); if(vis[p.x]==1) continue; for(int j=0;j<vec[p.x].size();j++){ node w=vec[p.x][j]; vis[p.x]=1; if(dis[w.x]<dis[p.x]+w.date){ dis[w.x]=dis[p.x]+w.date; node t; t.d=dis[w.x];t.x=w.x;t.date=w.date; que.push(t); } } } int sum=INF; for(int i=2;i<=ans;i++){ sum=max(sum,dis[i]); } cout<<sum<<endl; for(int i=1;i<=ans;i++){ vec[i].clear(); } } return 0; }