http://www.patest.cn/contests/pat-a-practise/1072
读题啊读题!!!
思路简单,只需要用dij,然后按要求输出,但是就2点不过,不知道那个要求读错了sad。。
等过几天清醒了再重新看吧
新知识
将字符串转化为其他形式或将其他形式转化为字符串
sscanf:char[]转其他和sprintf:其他转char[]
//scanf是从屏幕到n,故sscanf也是从str到n
sscanf(str,"%d",&n);
scanf("%d",&n);
//printf是从n到屏幕,故sprintf也是从n到str
<pre name="code" class="cpp">sprintf(str,"%d",n);
printf("%d",n);
//代码可优化,dis用一位数字即可,只要记住最大最小就好
//输入num[3]时,scanf("%s %s %d")
#include <cstdio>
#include <vector>
#include <string.h>
#define MAX 1100
using namespace std;
int dis[MAX][MAX];
struct node{
int next;
int wei;
};
vector <node> adj[MAX];
int n,m,k,ds;
int vis[MAX];
void dij(int x){
memset(vis,0,sizeof(vis));
int newp=x;
vis[newp]=1;
dis[x][newp]=0;
for(int i=0;i<n-1;i++){
for(int j=0;j<adj[newp].size();j++){
int u=adj[newp][j].next;
int c=adj[newp][j].wei;
if(vis[u]==0 && dis[x][u]==-1 || dis[x][u]>dis[x][newp]+c){
dis[x][u]=dis[x][newp]+c;
}
}
int min=123123123;
for(int j=0;j<MAX;j++){
if(dis[x][j]!=-1 && vis[j]==0 && dis[x][j]<min){
min=dis[x][j];
newp=j;
}
}
vis[newp]=1;
}
}
//dij,无需记录路径,只要记录,每个gas的dis就好
int main(){
memset(dis,-1,sizeof(dis));
freopen("in.txt","r",stdin);
scanf("%d %d %d %d",&n,&m,&k,&ds);
getchar();
for(int j=0;j<k;j++){
char s[3][10];
int num[3];
for(int i=0;i<3;i++){
scanf("%s",s[i]);
getchar();
if(i==2){
//将字符串转化为数字
sscanf(s[i],"%d",&num[i]);
}else{
if(s[i][0]=='G'){
s[i][0]='0';
sscanf(s[i],"%d",&num[i]);
num[i]+=n;
}else{
sscanf(s[i],"%d",&num[i]);
}
}
}
node tmp;
tmp.next=num[0];
tmp.wei=num[2];
adj[ num[1] ].push_back(tmp);
tmp.next=num[1];
adj[ num[0] ].push_back(tmp);
}
int total=1231213123,ans=-1,maxlu=0;
int cnt=0;
for(int i=n+1;i<=n+m;i++){
dij(i);
int all=0;
int tmax=123123123;
for(int j=1;j<=n;j++){
if(dis[i][j]>ds){
cnt++;
break;
}else{
all+=dis[i][j];
if(dis[i][j]<tmax){
tmax=dis[i][j];
}
}
}
if(maxlu<tmax){
maxlu=tmax;
total=all;
ans=i;
}else if(maxlu==tmax && total>all){
total=all;
ans=i;
}else if(maxlu==tmax && total==all && i<ans){
ans=i;
}
}
if(cnt==m){
printf("No Solution\n");
}else{
double a=(double)total/n;
double b=(double)maxlu;
printf("G%d\n",ans-n);
printf("%.1lf %.1lf\n",b,a);
}
return 0;
}