| ||||||||||
| 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 | |||||||||
用类似A*求K短路的方法可以完美AC这题~附代码Source Code
Problem: 1724 User: yzhw
Memory: 1248K Time: 32MS
Language: G++ Result: Accepted
Source Code
# include <cstdio>
# include <queue>
# include <vector>
# include <cstring>
using namespace std;
struct node
{
int t,len,money,next;
}l1[10001],l2[10001];
struct knode
{
int t,len,money;
};
int g1[101],g2[101];
int count1=0,count2=0;
int dis[101];
int n,m,k;
struct cmp
{
bool operator()(int a,int b)
{
return dis[a]>dis[b];
}
};
struct cmp1
{
bool operator()(knode a,knode b)
{
return a.len+dis[a.t]>b.len+dis[b.t];
}
};
void insert(node l[],int v1,int v2,int g[],int &c,int len,int money)
{
l[c].t=v2;
l[c].money=money;
l[c].next=g[v1];
l[c].len=len;
g[v1]=c++;
}
int main()
{
scanf("%d %d %d",&k,&n,&m);
for(int i=1;i<=n;i++)
g1[i]=g2[i]=-1;
for(int i=1;i<=m;i++)
{
int v1,v2,len,money;
scanf("%d%d%d%d",&v1,&v2,&len,&money);
insert(l1,v1,v2,g1,count1,len,money);
insert(l2,v2,v1,g2,count2,len,money);
}
{
priority_queue<int,vector<int>,cmp> q;
dis[n]=0;
q.push(n);
bool used[101];
memset(used,0,sizeof(used));
while(!q.empty())
{
int top=q.top();
q.pop();
if(used[top]) continue;
used[top]=true;
for(int p=g2[top];p!=-1;p=l2[p].next)
{
if(dis[l2[p].t]>dis[top]+l2[p].len)
{
dis[l2[p].t]=dis[top]+l2[p].len;
q.push(l2[p].t);
}
}
}
}
{
priority_queue<knode,vector<knode>,cmp1> q;
knode pos,tmp;
pos.len=0;
pos.t=1;
pos.money=0;
q.push(pos);
while(!q.empty())
{
pos=q.top();
q.pop();
if(pos.t==n)
{
printf("%d\n",pos.len);
goto end;
}
for(int p=g1[pos.t];p!=-1;p=l1[p].next)
{
tmp.t=l1[p].t;
tmp.money=pos.money+l1[p].money;
tmp.len=pos.len+l1[p].len;
if(tmp.money<=k)
q.push(tmp);
}
}
}
printf("-1\n");
end:;
// system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator