| ||||||||||
| 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:最杯具的莫过于英语题目能看懂,国语题目却看不懂。。。In Reply To:最杯具的莫过于英语题目能看懂,国语题目却看不懂。。。 Posted by:kaitian521 at 2010-12-10 14:49:10 //是/Dij算法,求单源最短路径。刚开始做连结果都打不出来,主要是对等级的处理, 原以为酋长等级L,那么只要周围的等级比他低就行了,直接在建图的时候把比酋长高的等级的节点删去
//就可以了,当时一直WA。后来才发现如果限制等级是M,那么就M+1种情况。比如:L=5,M=2,那么所有的情况为:
//3-5,4-6,5-7这种情况。因此对这M+1种情况逐一枚举,求最小。修改后发现还是不出结果,原来建图错误,方向搞
//错了,接下来就是一天半的RE,怎么改都是,索性扔那不管了。最后加了3条memset语句就过了,看来初始化还是有
//必要的啊。下面给出等级的判断式:
//level = true if(rank[i]>=t && rank[i]=<M+L 其中t是从L-M到L) 否则为false.
//M,N
//P、L、X
/*1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0*/
#include <iostream>
#include <cstring>
#define Inf 999999
using namespace std;
int G[101][101],D[101],rank[101],X,flag[1002];
int M,N,L;
void init() // 图论的输入有时很麻烦,避免混乱,还是先初始化好。
{
int t,x,y;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
G[i][j] = Inf;
}
}
for(int i=1;i<=N;i++)
{
cin>>G[0][i]>>rank[i]>>X;
for(int j=0;j<X;j++)
{
cin>>x>>y;
G[x][i] = y;
}
}
L = rank[1];
}//end init
int Dij()
{
int answer = Inf,min,v;
for(int t=L-M;t<=L;t++) //对着M+1种情况枚举
{
for(v=1;v<=N;v++) //开始经典的Dij啦
{
D[v] = G[0][v];
flag[v] = false;
}
flag[0] = true;
D[0]=0;
for(int w=1;w<=N;w++)
{
min = Inf;
for(int j=0;j<=N;j++)
{
if(!flag[j] && D[j]<min && rank[j]<=t+M && rank[j]>=t)//注意这里对等级的判定
{
min = D[j];
v = j;
}
}
flag[v] = true;
for(int k=0;k<=N;k++)
{
if(!flag[k] && min+G[v][k]<D[k] && rank[k]>=t && rank[k]<=t+M)//注意等级判定
{
D[k] = min+G[v][k];
}
}
}
if(D[1]<answer) answer = D[1];
}
return answer;
}
int main()
{
int answer,temp;
while(cin>>M>>N)
{
memset(D,0,sizeof(D));
memset(rank,0,sizeof(rank));
memset(flag,false,sizeof(flag)); //这三条memset害得我好惨
init();
answer = Dij();
cout<<answer<<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