您的位置:首页 > 其它

CCF20171204行车路线(20分错误)找不出错误暂时放置 希望有大神

2018-03-12 15:45 351 查看
/*
 * 问题描述

  小明和小芳出去乡村玩,小明负责开车,小芳来导航。
   小芳将可能的道路分为大道和小道。大道比较好走,每走1公里小明会增加1的疲劳度。小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2的疲劳度。
   例如:有5个路口,1号路口到2号路口为小道,2号路口到3号路口为小道,3号路口到4号路口为大道,4号路口到5号路口为小道,相邻路口之间的距离都是2公里。如果小明从1号路口到5号路口,则总疲劳值为(2+2)2+2+22=16+2+4=22。
   现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。

输入格式

  输入的第一行包含两个整数n, m,分别表示路口的数量和道路的数量。路口由1至n编号,小明需要开车从1号路口到n号路口。
   接下来m行描述道路,每行包含四个整数t, a, b, c,表示一条类型为t,连接a与b两个路口,长度为c公里的双向道路。其中t为0表示大道,t为1表示小道。保证1号路口和n号路口是连通的。

输出格式

  输出一个整数,表示最优路线下小明的疲劳度。

样例输入

6 7
 1 1 2 3
 1 2 3 2
 0 1 3 30
 0 3 4 20
 0 4 5 30
 1 3 5 6
 1 5 6 1

样例输出

76

样例说明

  从1走小道到2,再走小道到3,疲劳度为52=25;然后从3走大道经过4到达5,疲劳度为20+30=50;最后从5走小道到6,疲劳度为1。总共为76。
数据规模和约定
  对于30%的评测用例,1 ≤ n ≤ 8,1 ≤ m ≤ 10;
  对于另外20%的评测用例,不存在小道;
  对于另外20%的评测用例,所有的小道不相交;
  对于所有评测用例,1 ≤ n ≤ 500,1 ≤ m ≤ 105,1 ≤ a, b ≤ n,t是0或1,当t为0时c ≤ 105,当t为1时c≤ 80。保证答案不超过106。
解题思路

   使用邻接表存储边,基于迪杰斯特拉算法计算最短的疲劳值。使用一个长度为n的数组记录,某结点之前走的小道的长度。
  在Dijstra中比较更新最短路时,如果迭代到小路时,比较路的长度为((选取结点的最短路)-选取结点之前走的小路的平方+(选取结点之前走的小路长度+本结点选择的小路长度)的平方),如果比较路小于本结点当前最短路,则替换当前最短路,本结点之前走的小路长度记为(选取结点之前走的小路+本次走的小路长度),如果大于等于,不修改,继续迭代;如果迭代到大路,比较路的长度为(选取结点的最短路+本结点选择的大路),如果比较路小于本结点当前最短路,则替换当前最短路,且本结点之前走的最短路记为0,如果大于等于,不修改,继续迭代。直至n结点确定最短路,程序结束,输入n结点的最短路数值。
(有问题。。)
 */
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class 行车路线20171204 {

private static int MAX =Integer.MAX_VALUE;
public LinkedList<Type> list =new LinkedList<Type>();
public int lukounum;
public static List<LinkedList<Type>> listLink;
/*
public LinkedList bianli(LinkedList<Type> list,int v,int m){
LinkedList<Type> returnlist = new LinkedList<Type>();
int index =0;
for (int i = 0; i <list.size(); i++) {
Type t = list.get(i);
if(t.start==v){
returnlist.add(t);
list.remove(i);
}
}

return returnlist;

}
*/
/*
public boolean detect(boolean[] a){
boolean i  = false;
for (int j = 0; j < a.length; j++) {
if(a[j]==false){
i = true;
}
}

return i;

}*/
public int searchmin(int[] a, boolean[] b){
int index=0;
int res = MAX;
for(int i =0;i<a.length;i++){
if(b[i]==false&&a[i]<res){
res=a[i];
index= i;

}
}
b[index]=true; lukounum--;
return index ;
}
public void begin(){
int n,m;
Scanner sc =new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
listLink = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
listLink.add(new LinkedList<Type>());
}
for (int i = 0; i < m; i++) {
int a,b,c,d;
a=sc.nextInt();
b=sc.nextInt();
c=sc.nextInt();
d=sc.nextInt();
Type types =new Type(a,b,c,d);
listLink.get(b-1).add(types);

}
sc.close();
int[] mintable = new int
;//n =5, 0 1 2 3 4   表示 1 2 3 4 5 
boolean[] bool =new boolean
;
Arrays.fill(bool, false);
Arrays.fill(mintable, MAX);
mintable[0] = 0;
bool[0] = true;
int sum = 0;
lukounum = n-1;
int[] small=new int
;// 0 1 2 3 4    1 2 3 4 5 
while(lukounum>0){
int index= searchmin(mintable,bool);
//遍历 从index+1开始的路
LinkedList<Type> result = listLink.get(index);
Iterator<Type> p = result.iterator();

while(p.hasNext()){

Type next = p.next();
if(next.type==0){
sum = mintable[next.start-1]+ next.distance;
small[next.end-1]=0;
// System.out.println(sum); System.out.println(small[next.end-1]);
}else{
sum =(int)(mintable[next.start-1] - Math.pow(small[next.start-1], 2) + Math.pow((small[next.start-1]+next.distance), 2));
// System.out.println(small[next.start-1]+next.distance);
small[next.end-1] = small[next.start-1] +next.distance;
// System.out.println(mintable[next.start-1]);System.out.println(small[next.end-1]);
// System.out.println(sum); System.out.println(small[next.end-1]);
}
if(sum<=mintable[next.end-1]){mintable[next.end-1]=sum;  }
// for (int j = 0; j < mintable.length; j++) {
// System.out.println( "到路口" + (j+1) + "需要" + mintable[j] );
// }

}

}

System.out.println(  mintable[n-1] );

}

public static void main(String[] args) {
行车路线20171204 lala =new 行车路线20171204();

lala.begin();

}
}

class Type{
int type;
int start;
int end;
int distance;
public  Type(int type,int start,int end,int distance){
this.type=type;
this.start=start;
this.end=end;
this.distance=distance;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: