样例过测试点1数据自己测也是对的,但提交上去就是wa
查看原帖
样例过测试点1数据自己测也是对的,但提交上去就是wa
231084
Sweet_Baby楼主2021/9/25 16:48
#include<bits/stdc++.h>
using namespace std;
int head[20000006],num,ans[10000005],vis[10000006],anss[10000005],viss[10000005],headd[10000005],numm;
struct noo
{
	int from,to,dis,nixt;
}e[40000005],a[40000008];
void edg(int f,int t,int dis)
{
	e[++num].nixt=head[f];
	e[num].dis=dis;
	e[num].from =f;
	e[num].to=t;
	head[f]=num;
};
void adg(int ff,int tt,int diss)
{
	a[++numm].nixt=headd[ff];
	a[numm].dis=diss;
	a[numm].from =ff;
	a[numm].to=tt;
	headd[ff]=numm;
};
struct node
{
	int ss,dd;
	bool operator<(const node & x)const
	{
		return x.ss<ss;
	 } 
};
priority_queue<node> q;
priority_queue<node> qq;
int n,m,s;
int main()
{
	cin>>n>>m;
	s=1;
	memset(ans,0x3f3f3f3f,sizeof(ans));
	for(int i=1;i<=m;i++)
	{
		int aa,b,c;
		scanf("%d%d%d",&aa,&b,&c);
		
			edg(aa,b,c);
	   		adg(b,aa,c);
		
	}
	q.push((node){0,s});
	ans[s]=0;
	while(q.empty()!=1)
	{
		node dang=q.top();
		q.pop();
		int ddd=dang.dd,sss=dang.ss;
		if(vis[ddd]==1)
		continue;
		vis[ddd]=1;
		for(int i=head[ddd];i;i=e[i].nixt)
		{
			int tt=e[i].to;
			if(vis[tt]==0&&ans[ddd]+e[i].dis<ans[tt])
			{
				ans[tt]=ans[ddd]+e[i].dis;
				q.push((node){ans[tt],tt});
			}
			
		}
	}
	priority_queue<node> qq;
	memset(anss,0x3f3f3f3f,sizeof(anss));
	qq.push((node){0,s});
	anss[s]=0;
	while(qq.empty()!=1)
	{
		node dang=qq.top();
		qq.pop();
		int ddd=dang.dd,sss=dang.ss;
		if(viss[ddd]==1)
		continue;
		viss[ddd]=1;
		for(int i=headd[ddd];i;i=a[i].nixt)
		{
			int ttt=a[i].to;
			if(viss[ttt]==0&&anss[ddd]+a[i].dis<anss[ttt])
			{
				anss[ttt]=anss[ddd]+a[i].dis;
				qq.push((node){anss[ttt],ttt});
			}
			//cout<<endl;
		}
		//cout<<endl;
	}
	int ananan;
	for(int i=1;i<=n;i++)
	{
		//cout<<anss[i]<<endl;
		ananan+=ans[i]+anss[i];
	}
	cout<<ananan<<endl;
	return 0;
 } 
 
2021/9/25 16:48
加载中...