10分改成0分求助
查看原帖
10分改成0分求助
605945
luo_xiaoran楼主2023/4/23 14:29

10分:

#include<bits/stdc++.h>
using namespace std;
int ans,ans2,cnt,n,m,s,head[100010],head2[100010],dis[1010],dis2[1010];
bool vis[1010],vis2[1010];
struct edge{
	int to,next,dis;
}e[100010],e2[100010];
struct node{
	int pos,dis;
	bool operator <(const node &x)const{
		return x.dis<dis;
	}
};
priority_queue<node> q;
void dijkstra(){
	dis[s]=0;
	q.push((node){s,0});
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int x=tmp.pos,d=tmp.dis;
		if(vis[x])
			continue;
		vis[x]=1;
		for(int i=head[x];i;i=e[i].next){
			int y=e[i].to;
			if(dis[y]>dis[x]+e[i].dis){
				dis[y]=dis[x]+e[i].dis;
				if(!vis[y])
					q.push((node){y,dis[y]});
			}
		}
	}
}
void dijkstra2(){
	dis2[s]=0;
	q.push((node){s,0});
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int x=tmp.pos,d=tmp.dis;
		if(vis2[x])
			continue;
		vis2[x]=1;
		for(int i=head2[x];i;i=e2[i].next){
			int y=e2[i].to;
			if(dis[y]>dis2[x]+e2[i].dis){
				dis2[y]=dis2[x]+e2[i].dis;
				if(!vis2[y])
					q.push((node){y,dis[y]});
			}
		}
	}
}
void add1(int u,int v,int d){
	e[++cnt].dis=d;
	e[cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void add2(int u,int v,int d){
	e2[++cnt].dis=d;
	e2[cnt].to=v;
	e2[cnt].next=head[u];
	head2[u]=cnt;
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=n;i++)
		dis[i]=0x7fffff;
	for(int u,v,d,i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&d);
		add1(u,v,d);
		add2(v,u,d);
	}
	dijkstra();
	for(int i=1;i<=n;i++)
		ans=max(ans,dis[i]);
	dijkstra2();
	for(int i=1;i<=n;i++)
		ans2=max(ans2,dis2[i]);
	printf("%d",ans+ans2);
	return 0;
}

0分代码:

#include<bits/stdc++.h>
using namespace std;
int ans,ans2,cnt,cnt2,n,m,s,head[100010],head2[100010],dis[1010],dis2[1010];
bool vis[1010],vis2[1010];
struct edge{
	int to,next,dis;
}e[100010],e2[100010];
struct node{
	int pos,dis;
	bool operator <(const node &x)const{
		return x.dis<dis;
	}
};
priority_queue<node> q;
void dijkstra(){
	dis[s]=0;
	q.push((node){s,0});
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int x=tmp.pos,d=tmp.dis;
		if(vis[x])
			continue;
		vis[x]=1;
		for(int i=head[x];i;i=e[i].next){
			int y=e[i].to;
			if(dis[y]>dis[x]+e[i].dis){
				dis[y]=dis[x]+e[i].dis;
				if(!vis[y])
					q.push((node){y,dis[y]});
			}
		}
	}
}
void dijkstra2(){
	dis2[s]=0;
	q.push((node){s,0});
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int x=tmp.pos,d=tmp.dis;
		if(vis2[x])
			continue;
		vis2[x]=1;
		for(int i=head2[x];i;i=e2[i].next){
			int y=e2[i].to;
			if(dis2[y]>dis2[x]+e2[i].dis){
				dis2[y]=dis2[x]+e2[i].dis;
				if(!vis2[y])
					q.push((node){y,dis2[y]});
			}
		}
	}
}
void add1(int u,int v,int d){
	e[++cnt].dis=d;
	e[cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void add2(int u,int v,int d){
	e2[++cnt2].dis=d;
	e2[cnt2].to=v;
	e2[cnt2].next=head2[u];
	head2[u]=cnt2;
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=n;i++)
		dis[i]=0x7fffff;
	for(int i=1;i<=n;i++)
		dis2[i]=0x7fffff;
	for(int u,v,d,i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&d);
		add1(u,v,d);
		add2(v,u,d);
	}
	dijkstra();
	for(int i=1;i<=n;i++)
		ans=max(ans,dis[i]);
	dijkstra2();
	for(int i=1;i<=n;i++)
		ans2=max(ans2,dis2[i]);
	printf("%d",ans+ans2);
	return 0;
}
2023/4/23 14:29
加载中...