Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
写份解题报告,只是菜鸟,大牛别见笑#include<iostream> #include<vector> #include<algorithm> #define MAX 2147483647 using namespace std; //描述:一个地方有F个farm,分别为f1,f2,...,fp. //其中,f1是谷仓!有几只tmd的肥牛站在这些fram上,它们闲着没事干就想着去 //偷吃谷子,可惜,在它们吃到谷子之前M秒,有个摄像头把它们的位置拍下来了 //!fi与fj之间有路径连通,并且知道走这条路径的时间t。我们还知道总共有C //只牛,它们各自站在不同或者相同的farm上! //这题是我做过的最复杂的dijkstra,只要把关系理清,其实也不难 //解题思路:首先a数组是用来存地图的 //dist很有学问,他不仅要放最短路径长,还要放这个点上的牛的编号,可能有多个牛,故定义成一个结构体 // 它包含一个长度d和一个容器 //在初始化过程中要特别初始化对角线,还有对之前的case要把v清空 //输入边时考虑重边取最小的 //接下来就是dijkstra了,最后线性扫描dist,把距离小于m的找出来 //如果它的v非空,则把他所含的牛的编号放入新的容器vv中 //对它排序输出 struct NODE { int d; vector<int> v;//这个是用来放牛的编号的,因为同一个地方可能有好机头牛 }dist[501]; bool s[501]; int a[501][501]; int main() { int n,i,j,k,min,temp,f,p,c,m,x,y,len;//f是农场个数,p是边数,c牛的个数,m是时限 while(cin>>f>>p>>c>>m) { for(i=1;i<=f;i++)//初始化 { for(j=1;j<=f;j++) { a[i][j]=MAX; } a[i][i]=0; (dist[i].v).clear();//对之前case进行处理 } for(i=1;i<=p;i++)//输入边,注意有重边选最小的那条 { cin>>x>>y>>len; if(a[x][y]>len) { a[x][y]=len; a[y][x]=len; } } for(i=1;i<=c;i++) { cin>>n; (dist[n].v).push_back(i); } for(i=1;i<=f;i++) { dist[i].d=a[1][i]; s[i]=0; } s[1]=1; for(i=1;i<f;i++) { min=MAX; j=1; for(k=2;k<=f;k++) { if(!s[k]&&dist[k].d<min) { min=dist[k].d; j=k; } } s[j]=1; for(k=2;k<=f;k++) { if(!s[k]&&a[j][k]<MAX) { temp=dist[j].d+a[j][k]; if(temp<dist[k].d) { dist[k].d=temp; // } } } } vector<int>vv; for(i=1;i<=f;i++) { // cout<<"dist["<<i<<"].d="<<dist[i].d<<endl; // system("pause"); if(dist[i].d<=m)//可疑对象的条件成立 { if(!(dist[i].v).empty())//这地方有牛! { for(j=0;j<(dist[i].v).size();j++)//这个地方所有的牛都放进容器里 { vv.push_back((dist[i].v)[j]); } } } } sort(vv.begin(),vv.end());//对牛编号排序,按升序输出 cout<<vv.size()<<endl; for(i=0;i<vv.size();i++) { cout<<vv[i]<<endl; } } return 0; } //写的不好还请见谅^__^ Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator