您的位置:首页 > 产品设计 > UI/UE

UESTC 914 -- 方老师分身 I(Dijkstra)

2015-04-07 19:06 323 查看
题目大意:

给出分身的点,求到各个点的往返路径。

思路分析:

正序用Dijkstra求一遍到各个点的最短路径(这是去的路径),再反向建图,用Dijkstra求一遍到各个点的最短路径(返回路径);

代码实现:

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int top,n,m,x,dis[3][1010],visit[1010],pos[100010][3];

struct Edge{
int v1,va;
Edge *next;
}*head[1010],e[100010];

void Addedge(int from,int to,int v){
Edge *p=&e[top++];
p->v1=to;
p->va=v;
p->next=head[from];
head[from]=p;
}

void Dijkstra(int i){
priority_queue<int> q;
memset(visit,0,sizeof(visit));
dis[i][x]=0;
q.push(x);
int from,to;
while(!q.empty()){
from=q.top();
q.pop();
visit[x]=1;
for(Edge *p=head[from];p;p=p->next){
to=p->v1;
if(!visit[to]&&dis[i][to]>dis[i][from]+p->va){
dis[i][to]=dis[i][from]+p->va;
q.push(to);
}
}
}
}

int main(){
while(~scanf("%d%d%d",&n,&m,&x)){
memset(dis,0x3f,sizeof(dis));
memset(head,0,sizeof(head));
top=0;
for(int i=0;i<m;i++){
scanf("%d%d%d",&pos[i][0],&pos[i][1],&pos[i][2]);
Addedge(pos[i][0],pos[i][1],pos[i][2]);
}
Dijkstra(0);
memset(head,0,sizeof(head));
top=0;
for(int i=0;i<m;i++) Addedge(pos[i][1],pos[i][0],pos[i][2]);
Dijkstra(1);
int max_r=0;
for(int i=1;i<=n;i++){
if(dis[0][i]+dis[1][i]>max_r)
max_r=dis[0][i]+dis[1][i];
}
printf("%d\n",max_r);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: