非常之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);