单源最短路,但是要求出在最短路的限制下,所需要的话费也要最少
故比平常的算法多加个优先队列,也就是优先处理那些发费小的,然后处理过就标记了就行了,下次就不会再去处理了
代码如下。也不是很懂,回头再看
#include<stdio.h>
#include<queue>
using namespace std;
#include<string.h>
long long u[200010];
long long d[200010];
long long w[200010];
long long first[200010];
long long next[200010];
long long dis[200010];
long long vis[200010];
struct node
{
long long x,d,w;
node(long long x,long long d,long long w):x(x),d(d),w(w) {};
bool operator<(const node &a)const
{
if(d==a.d)
return w>a.w;
else return d>a.d;
}
};
int main()
{
long long test;
scanf("%lld",&test);
while(test--)
{
//memset(vis,0,sizeof(vis));
long long n,m;
scanf("%lld%lld",&n,&m);
for (long long i = 0; i <= n; i++)
dis[i] = first[i] = -1, vis[i] = 0;
long long count=0;
for(long long i=1; i<=m; i++)
{
long long x,y,a,b;
scanf("%lld%lld%lld%lld",&x,&y,&a,&b);
u[count]=y;
d[count]=a;
w[count]=b;
next[count]=first[x];
first[x]=count++;
u[count]=x;
d[count]=a;
w[count]=b;
next[count]=first[y];
first[y]=count++;
}
priority_queue<node>q;
q.push(node(0,0,0));
dis[0]=0;
long long ansd=0;
long long answ=0;
while(!q.empty())
{
node now=q.top();
q.pop();
if(vis[now.x]==1)
continue;
else vis[now.x]=1;
ansd+=now.d;
answ+=now.w;
for(long long i=first[now.x]; i!=-1; i=next[i])
{
if(dis[u[i]]==-1||dis[u[i]]>=now.d+d[i])
{
dis[u[i]]=now.d+d[i];
q.push(node (u[i], dis[u[i]], w[i]));
}
}
}
printf("%lld %lld\n",ansd,answ);
}
}
HDU 2680
反向遍历
#include<stdio.h>
#include<queue>
using namespace std;
#include<string.h>
#define INF 0x3f3f3f3f
long long u[100010];
long long d[100010];
long long w[100010];
long long first[100010];
long long nextt[100010];
long long dis[100010];
long long vis[100010];
struct node
{
long long x,d;
node(long long x,long long d):x(x),d(d) {};
bool operator<(const node &a)const
{
if(d==a.d) return x<a.x;
else return d > a.d;
}
};
int main()
{
//memset(vis,0,sizeof(vis));
long long n,m,s;
while( scanf("%lld%lld%lld",&n,&m,&s)!=EOF)
{
for (long long i = 0; i <= n; i++)
dis[i] =INF,first[i] = -1, vis[i] = 0;
long long count=0;
for(long long i=1; i<=m; i++)
{
long long x,y,a,b;
scanf("%lld%lld%lld",&x,&y,&a);
u[count]=x;
d[count]=a;
nextt[count]=first[y];
first[y]=count++;
}
priority_queue<node>q;
dis[s]=0;
q.push(node(s,dis[s]));
while(!q.empty())
{
node now=q.top();
q.pop();
for(long long i=first[now.x]; i!=-1; i=nextt[i])
{
if(dis[u[i]]>now.d+d[i])
{
dis[u[i]]=now.d+d[i];
q.push(node (u[i], dis[u[i]]));
}
}
}
// for(long long i=1; i<=n; i++)
// printf("%d\n",dis[i]);
long long t;
long long minn=INF;
scanf("%lld",&t);
while(t--)
{
long long kk;
scanf("%lld",&kk);
minn=min(minn,dis[kk]);
}
if(minn==INF)
printf("-1\n");
else printf("%lld\n",minn);
}
}