警惕后人,本题题目有重边。题目没说
查看原帖
警惕后人,本题题目有重边。题目没说
184082
qq1528344561楼主2023/7/25 15:14

非常之ex,赛时调麻了。 重边就会导致上面这份代码爆0,下面这份代码AC

爆0:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define endl '\n'
#define int long long
using namespace std;

const int N = 1e5+10;
int dp[110][110];
int n,k[110];
int g[110][110][110];

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	memset(dp,0x3f,sizeof dp);
	memset(g,0x3f,sizeof g);
	
	k[0] =1;
	dp[0][1]  =0;
	for(int i =1;i<=n;i++)
	{
		cin>>k[i];
		for(int j =1;j<=k[i];j++)
		{
			int x,cost;
			while(cin>>x&&x)
			{
				cin>>cost;
				g[dep-1][j][i] = cost;
				
			}
		}
	}
	
	
	for(int dep= 1;dep<=n;dep++)
	{
		for(int i =1;i<=k[dep];i++)
		{
			for(int j =1;j<=k[dep-1];j++)
			{
				dp[dep][i] = min(dp[dep][i],dp[dep-1][j]+g[dep-1][j][i]);
				//cout<<dep<<":"<<j<<" "<<i<<" "<<dp[dep][i]<<endl;
			}
			
		}
	}
	int res = 2147483647;
	for(int i =1;i<=k[n];i++)
	{
		res = min(res,dp[n][i]);
	}
	cout<<res;
	return 0;
}

AC:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define endl '\n'
#define int long long
using namespace std;

const int N = 1e5+10;
int dp[110][110];
int n,k[110];
int g[110][110][110];

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	memset(dp,0x3f,sizeof dp);
	memset(g,0x3f,sizeof g);
	
	k[0] =1;
	dp[0][1]  =0;
	for(int i =1;i<=n;i++)
	{
		cin>>k[i];
		for(int j =1;j<=k[i];j++)
		{
			int x,cost;
			while(cin>>x&&x)
			{
				cin>>cost;
				g[dep-1][j][i] = cost;
				
				dp[i][j] = min(dp[i][j],dp[i-1][x]+cost);
			}
		}
	}
	
	
	int res = 2147483647;
	for(int i =1;i<=k[n];i++)
	{
		res = min(res,dp[n][i]);
	}
	cout<<res;
	return 0;
}

只要输入的时候取个min即可。 g[i-1][x][j] = min(g[i-1][x][j],cost);

2023/7/25 15:14
加载中...