hdu_3788_单源最短路
2011-03-11 19:34
218 查看
//dij的模板,增加一个域,保存两点之间的花费
#include<iostream>
#include<cstdio>
#include<memory.h>
#include <deque>
using namespace std;
struct edge
{
int p,q; //p为距离,q为花费,p的优先级比q高
}g[1001][1001];
struct dis_cos
{
int d,c; //d,c对应edge结构的p,q
}dis[1001];
int visit[1001];
int n,m;
#define max 100000000
void dij(int s)
{
int i,j;
memset(visit,0,sizeof(visit));
visit[s]=1;
for(j=1;j<=n;j++)
{
dis[j].d=g[s][j].p;
dis[j].c=g[s][j].q;
}
int min1,min2,index;
for(i=1;i<n;i++)
{
min1=max;
min2=max;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j].d<min1)
{
index=j;
min1=dis[j].d;
}
else if(!visit[j]&&dis[j].d==min1&&dis[j].c<min2)
{
index=j;
min2=dis[j].c;
}
if(min1==max&&min2==max)
break;
visit[index]=1;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[index].d+g[index][j].p<dis[j].d)
{
dis[j].d=dis[index].d+g[index][j].p;
dis[j].c=dis[index].c+g[index][j].q;
}
else if(!visit[j]&&dis[index].d+g[index][j].p==dis[j].d&&dis[index].c+g[index][j].q<dis[j].c)
{
dis[j].c=dis[index].c+g[index][j].q;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m),n&&m)
{
int i,j,x,y,p,q;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
g[i][j].p=(i==j?0:max);
g[i][j].q=(i==j?0:max);
}
while(m--)
{
scanf("%d%d%d%d",&x,&y,&p,&q);
if(g[x][y].p>p)
{
g[x][y].p=p;
g[x][y].q=q;
g[y][x]=g[x][y];
}
else if(g[x][y].p==p&&g[x][y].q>q)
{
g[x][y].q=q;
g[y][x]=g[x][y];
}
}
scanf("%d%d",&x,&y);
dij(x);
printf("%d %d/n",dis[y].d,dis[y].c);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<memory.h>
#include <deque>
using namespace std;
struct edge
{
int p,q; //p为距离,q为花费,p的优先级比q高
}g[1001][1001];
struct dis_cos
{
int d,c; //d,c对应edge结构的p,q
}dis[1001];
int visit[1001];
int n,m;
#define max 100000000
void dij(int s)
{
int i,j;
memset(visit,0,sizeof(visit));
visit[s]=1;
for(j=1;j<=n;j++)
{
dis[j].d=g[s][j].p;
dis[j].c=g[s][j].q;
}
int min1,min2,index;
for(i=1;i<n;i++)
{
min1=max;
min2=max;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j].d<min1)
{
index=j;
min1=dis[j].d;
}
else if(!visit[j]&&dis[j].d==min1&&dis[j].c<min2)
{
index=j;
min2=dis[j].c;
}
if(min1==max&&min2==max)
break;
visit[index]=1;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[index].d+g[index][j].p<dis[j].d)
{
dis[j].d=dis[index].d+g[index][j].p;
dis[j].c=dis[index].c+g[index][j].q;
}
else if(!visit[j]&&dis[index].d+g[index][j].p==dis[j].d&&dis[index].c+g[index][j].q<dis[j].c)
{
dis[j].c=dis[index].c+g[index][j].q;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m),n&&m)
{
int i,j,x,y,p,q;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
g[i][j].p=(i==j?0:max);
g[i][j].q=(i==j?0:max);
}
while(m--)
{
scanf("%d%d%d%d",&x,&y,&p,&q);
if(g[x][y].p>p)
{
g[x][y].p=p;
g[x][y].q=q;
g[y][x]=g[x][y];
}
else if(g[x][y].p==p&&g[x][y].q>q)
{
g[x][y].q=q;
g[y][x]=g[x][y];
}
}
scanf("%d%d",&x,&y);
dij(x);
printf("%d %d/n",dis[y].d,dis[y].c);
}
return 0;
}
相关文章推荐
- 2014西安全国邀请赛 1003 && HDU 4849 Wow! Such City! (单源最短路Djikstra算法)
- HDU-3665(单源最短路)
- HDU 2680 Choose the best route 最短路、Dijkstra、多源化单源最短路
- hdu 2112 HDU Today (单源最短路)
- HDU-1548 A strange lift(单源最短路 或 BFS)
- hdu 3790 (单源最短路dijkstra)
- HDU 2066 一个人的旅行(单源最短路SPFA)
- HDU 3790 最短路径问题(单源最短路)
- HDU 5637 Transform 单源最短路
- HDU 1535 Invitation Cards 单源最短路
- HDU 2544 最短路(单源最短路 dijkstra / floyd / dijkstra(堆优化)/dijkstra+邻接链表+堆优化)
- HDU 2544 最短路 (单源最短路)
- HDU 1535 Invitation Cards【SPFA最短路】【正反向建边求单源最短路之和】
- HDU - 2544 单源最短路
- HDU - 2544 - 最短路 (最基础单源最短路问题!!dijkstra+floyd+SPFA)
- HDU-3665(单源最短路)
- HDU1874 单源最短路
- HdU2680——Choose the best route(单源最短路Bell man-ford)
- HDU 3790 最短路径问题(单源最短路---Dijkstra算法)
- HDU 1142(单源最短路,记忆DFS)