E题样例未过求条
  • 板块学术版
  • 楼主Ekin123
  • 当前回复2
  • 已保存回复3
  • 发布时间2025/7/27 08:58
  • 上次更新2025/7/27 17:39:05
查看原帖
E题样例未过求条
1235038
Ekin123楼主2025/7/27 08:58
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

long long f[505][505];

int main()
{
	int n,m;
	cin >> n >> m;
	for(int i = 0;i <= n;i++)
	{
		for(int j = 0;j <= n;j++)
		{
			if(i == j) continue;
			f[i][j] = 4e18;
		}
	}
	while(m--)
	{
		long long a,b,c;
		cin >> a >> b >> c;
		f[a][b] = min(f[a][b],c);
		f[b][a] = min(f[b][a],c);
	}
	long long k,t;
	cin >> k >> t;
	while(k--)
	{
		int a;
		cin >> a;
		f[0][a] = min(f[0][a],t);
		f[a][0] = min(f[a][0],0ll);
	}
	for(int k = 0;k <= n;k++)
	{
		for(int i = 0;i <= n;i++)
		{
			for(int j = 0;j <= n;j++)
			{
				f[i][j] = min(f[i][j],f[i][k] + f[k][j]);
			}
		}
	}
	int q;
	cin >> q;
	while(q--)
	{
		int op;
		cin >> op;
		if(op == 1)
		{
			long long x,y,w;
			cin >> x >> y >> w;
			f[x][y] = min(f[x][y],w);
			f[y][x] = min(f[y][x],w);
			for(int i = 0;i <= n;i++)
			{
				f[x][i] = min(f[x][i],f[x][y] + f[y][i]);
			}
			for(int i = 0;i <= n;i++)
			{
				f[i][x] = f[x][i];
			}
			for(int i = 0;i <= n;i++)
			{
				f[y][i] = min(f[y][i],f[y][x] + f[x][i]);
			}
			for(int i = 0;i <= n;i++)
			{
				f[i][y] = f[y][i];
			}
		}
		else if(op == 2)
		{
			int x;
			cin >> x;
			f[0][x] = min(f[0][x],t);
			f[x][0] = min(f[x][0],0ll);
			for(int i = 0;i <= n;i++)
			{
				f[x][i] = min(f[x][i],f[x][0] + f[0][i]);
			}
			for(int i = 0;i <= n;i++)
			{
				f[i][x] = f[x][i];
			}
			for(int i = 0;i <= n;i++)
			{
				f[0][i] = min(f[0][i],f[0][x] + f[x][i]);
			}
			for(int i = 0;i <= n;i++)
			{
				f[i][0] = f[0][i];
			}
		}
		else
		{
			long long sum = 0;
			for(int i = 1;i <= n;i++)
			{
				for(int j = 1;j <= n;j++)
				{
					if(f[i][j] < 4e18)
					{
						sum += f[i][j];
					}
				}
			}
			cout << sum << endl;
		}
	}
	return 0;
} 
2025/7/27 08:58
加载中...