标签:
Description
Input
Output
Sample Input
5 50 30 5 100 20 50 10 x x 10
Sample Output
35
这道题就是求节点1到其他节点的最小值,然后去其中的最大值即可。
代码:
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f;
const int MAXN=103;
struct Edge
{
int v,w;
};
vector<Edge>edge[MAXN];
int dis[MAXN];
int cnt[MAXN];
bool vis[MAXN];
void addedge(int u,int v,int w)
{
Edge e;
e.v=v;
e.w=w;
edge[u].push_back(e);
}
bool spfa(int s,int n)
{
memset(vis,false,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)
dis[i]=INF;
queue<int >que;
while(!que.empty())
que.pop();
que.push(s);
dis[s]=0;
cnt[s]=1;
vis[s]=true;
while(!que.empty())
{
int u=que.front();
que.pop();
vis[u]=false;
for(int i=0;i<edge[u].size();i++)
{
int v=edge[u][i].v;
int w=edge[u][i].w;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
if(!vis[v])
{
vis[v]=true;
que.push(v);
cnt[v]++;
if(cnt[v]>n) //超过n次即为有负环
return false;
}
}
}
}
return true;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF) //若一道题没有说明输入test个数,也没有 输入 0 0 结束之类的,则必须判断 !=EOF,不然会 tle 。
{
for(int i=1;i<=n;i++)
edge[i].clear();
for(int i=1;i<=n;i++)
addedge(i,i,0);
for(int i=2;i<=n;i++)
for(int j=1;j<i;j++)
{
char s[100];
scanf("%s",&s); //字符串输入用 %s ,字符用 %c
if(s[0]==‘x‘)
{
addedge(i,j,INF);
addedge(j,i,INF);
}
else
{
int w=0,len=strlen(s);
for(int k=0;k<len;k++)
{
w*=10;
w+=s[k]-‘0‘; //记住要 -‘0‘
}
addedge(i,j,w);
addedge(j,i,w);
}
}
bool ans=spfa(1,n);
int max=0;
for(int i=1;i<=n;i++)
{
if(dis[i]!=INF&&dis[i]>max)
max=dis[i];
}
printf("%d\n",max);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4248158.html