| ||||||||||
| 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 | |||||||||
Re:求助啊啊啊,用dijkstra做WA到底,找了能找的测试数据均通过了啊,附代码(有注释啊啊)In Reply To:求助啊啊啊,用dijkstra做WA到底,找了能找的测试数据均通过了啊,附代码(有注释啊啊) Posted by:jus_one at 2015-03-04 21:55:59 > /*
> 1。与酋长等级差超过m直接排除
> 2.分别以j(2...n)为源点,1为终点执行dijkstra(执行前先排除等级不在范围的点)
> 3.取得所有结果的最小值
> */
> #include<cstdio>
> #include<cstring>
> #define INF 0x03f3f3f3f
> const int N=101;
> int dist[N],G[N][N],level[N],money[N];
> bool vis[N];
> int left,right;
> bool under_limit(int l)
> {
> return (l>=left&&l<=right);
> }
> int dijkstra(int s,int n)
> {
> int i,j,min;
> vis[s]=true;
> for(i=1;i<=n;++i){
> dist[i]=INF;
> }
> dist[s]=0;
> int pre=s;
> for(i=1;i<n;++i){
> min=INF;
> for(j=1;j<=n;++j)//取得最优点pre
> if(!vis[j]&&dist[j]<min)
> min=dist[j],pre=j;
> for(j=1;j<=n;++j)//更新dist
> if(vis[j]==0&&(dist[pre]+G[pre][j]<dist[j]))
> dist[j]=dist[pre]+G[pre][j];
> vis[pre]=true;
> }
> return dist[1];
> }
> int min(int a,int b){return a<b?a:b;}
> int main()
> {
> int i,j,n,m,p,l,x,t,v;
> scanf("%d %d",&m,&n);
> for(i=0;i<N;++i)
> for(j=0;j<N;++j)G[i][j]=INF;
> for(i=1;i<=n;++i){
> scanf("%d %d %d",&p,&l,&x);
> level[i]=l,money[i]=p;
> for(j=0;j<x;++j)
> {
> scanf("%d %d",&t,&v);
> G[t][i]=v;
> }
> }
> int ans=INF;
> for(i=1;i<=n;++i)
> if(level[i]-level[1]<=m&&level[i]-level[1]>=-m){/*起点与终点等级相差不大于M*/
> if(level[i]<level[1])/*计算得到以j为起点1为终点要求的等级范围*/
> left=level[1]-m,right=level[i]+m;
> else
> left=level[i]-m,right=level[1]+m;
> memset(vis,0,sizeof(vis));
> for(j=1;j<=n;++j)
> {
> if(!under_limit(level[j]))/*把不在范围的点标记为已访问,表示不再访问*/
> vis[j]=true;
> }
> ans=min(dijkstra(i,n)+money[i],ans);/**/
> }
> printf("%d\n",ans);
> return 0;
>
> }
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator